appwrite-cli 13.3.0 → 13.3.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Change Log
2
2
 
3
+ ## 13.3.2
4
+
5
+ - Fix handle null rows in table parser
6
+ - Export config zod schemas
7
+
8
+ ## 13.3.1
9
+
10
+ - Fix generated TS imports to auto-detect ESM vs non-ESM
11
+
3
12
  ## 13.3.0
4
13
 
5
14
  - Support type generation for text/varchar/mediumtext/longtext attributes
package/README.md CHANGED
@@ -29,7 +29,7 @@ Once the installation is complete, you can verify the install using
29
29
 
30
30
  ```sh
31
31
  $ appwrite -v
32
- 13.3.0
32
+ 13.3.2
33
33
  ```
34
34
 
35
35
  ### Install using prebuilt binaries
@@ -60,7 +60,7 @@ $ scoop install https://raw.githubusercontent.com/appwrite/sdk-for-cli/master/sc
60
60
  Once the installation completes, you can verify your install using
61
61
  ```
62
62
  $ appwrite -v
63
- 13.3.0
63
+ 13.3.2
64
64
  ```
65
65
 
66
66
  ## Getting Started
@@ -21981,7 +21981,6 @@ var require_safe_buffer = __commonJS({
21981
21981
  function SafeBuffer(arg, encodingOrOffset, length) {
21982
21982
  return Buffer2(arg, encodingOrOffset, length);
21983
21983
  }
21984
- SafeBuffer.prototype = Object.create(Buffer2.prototype);
21985
21984
  copyProps(Buffer2, SafeBuffer);
21986
21985
  SafeBuffer.from = function(arg, encodingOrOffset, length) {
21987
21986
  if (typeof arg === "number") {
@@ -93398,7 +93397,7 @@ var package_default = {
93398
93397
  type: "module",
93399
93398
  homepage: "https://appwrite.io/support",
93400
93399
  description: "Appwrite is an open-source self-hosted backend server that abstracts and simplifies complex and repetitive development tasks behind a very simple REST API",
93401
- version: "13.3.0",
93400
+ version: "13.3.2",
93402
93401
  license: "BSD-3-Clause",
93403
93402
  main: "dist/index.js",
93404
93403
  types: "dist/index.d.ts",
@@ -107662,7 +107661,7 @@ import childProcess from "child_process";
107662
107661
  // lib/constants.ts
107663
107662
  var SDK_TITLE = "Appwrite";
107664
107663
  var SDK_TITLE_LOWER = "appwrite";
107665
- var SDK_VERSION = "13.3.0";
107664
+ var SDK_VERSION = "13.3.2";
107666
107665
  var SDK_NAME = "Command Line";
107667
107666
  var SDK_PLATFORM = "console";
107668
107667
  var SDK_LANGUAGE = "cli";
@@ -134308,14 +134307,21 @@ var drawTable = (data) => {
134308
134307
  console.log("[]");
134309
134308
  return;
134310
134309
  }
134311
- const obj = data.reduce((res, item) => ({ ...res, ...item }), {});
134310
+ const rows = data.map(
134311
+ (item) => item && typeof item === "object" && !Array.isArray(item) ? item : {}
134312
+ );
134313
+ const obj = rows.reduce((res, item) => ({ ...res, ...item }), {});
134312
134314
  const keys = Object.keys(obj);
134315
+ if (keys.length === 0) {
134316
+ drawJSON(data);
134317
+ return;
134318
+ }
134313
134319
  const def = keys.reduce((result, key) => {
134314
134320
  result[key] = "-";
134315
134321
  return result;
134316
134322
  }, {});
134317
- data = data.map((item) => ({ ...def, ...item }));
134318
- const columns = Object.keys(data[0]);
134323
+ const normalizedData = rows.map((item) => ({ ...def, ...item }));
134324
+ const columns = Object.keys(normalizedData[0]);
134319
134325
  const table = new import_cli_table3.default({
134320
134326
  head: columns.map((c) => import_chalk.default.cyan.italic.bold(c)),
134321
134327
  chars: {
@@ -134336,10 +134342,10 @@ var drawTable = (data) => {
134336
134342
  middle: import_chalk.default.cyan("\u2502")
134337
134343
  }
134338
134344
  });
134339
- data.forEach((row) => {
134345
+ normalizedData.forEach((row) => {
134340
134346
  const rowValues = [];
134341
- for (const key in row) {
134342
- if (row[key] === null) {
134347
+ for (const key of columns) {
134348
+ if (row[key] == null) {
134343
134349
  rowValues.push("-");
134344
134350
  } else if (Array.isArray(row[key])) {
134345
134351
  rowValues.push(JSON.stringify(row[key]));
@@ -138158,6 +138164,22 @@ function getAppwriteDependency() {
138158
138164
  }
138159
138165
  return "appwrite";
138160
138166
  }
138167
+ function detectImportExtension(cwd = process.cwd()) {
138168
+ try {
138169
+ const pkgPath = path6.resolve(cwd, "package.json");
138170
+ if (fs7.existsSync(pkgPath)) {
138171
+ const pkg = JSON.parse(fs7.readFileSync(pkgPath, "utf-8"));
138172
+ if (pkg.type === "module") {
138173
+ return ".js";
138174
+ }
138175
+ }
138176
+ if (fs7.existsSync(path6.resolve(cwd, "deno.json")) || fs7.existsSync(path6.resolve(cwd, "deno.jsonc"))) {
138177
+ return ".ts";
138178
+ }
138179
+ } catch {
138180
+ }
138181
+ return "";
138182
+ }
138161
138183
  function supportsServerSideMethods(appwriteDep, override = "auto") {
138162
138184
  if (override === "true") return true;
138163
138185
  if (override === "false") return false;
@@ -143744,10 +143766,10 @@ var BaseDatabasesGenerator = class {
143744
143766
  var types_ts_default = "import { type Models } from '{{appwriteDep}}';\n\n{{{ENUMS}}}{{{TYPES}}}\ndeclare const __roleStringBrand: unique symbol;\nexport type RoleString = string & { readonly [__roleStringBrand]: never };\n\nexport type RoleBuilder = {\n any: () => RoleString;\n user: (userId: string, status?: string) => RoleString;\n users: (status?: string) => RoleString;\n guests: () => RoleString;\n team: (teamId: string, role?: string) => RoleString;\n member: (memberId: string) => RoleString;\n label: (label: string) => RoleString;\n}\n\nexport type PermissionBuilder = {\n read: (role: RoleString) => string;\n write: (role: RoleString) => string;\n create: (role: RoleString) => string;\n update: (role: RoleString) => string;\n delete: (role: RoleString) => string;\n}\n\nexport type PermissionCallback = (permission: PermissionBuilder, role: RoleBuilder) => string[];\n\nexport type QueryValue = string | number | boolean;\n\nexport type ExtractQueryValue<T> = T extends (infer U)[]\n ? U extends QueryValue ? U : never\n : T extends QueryValue | null ? NonNullable<T> : never;\n\nexport type QueryableKeys<T> = {\n [K in keyof T]: ExtractQueryValue<T[K]> extends never ? never : K;\n}[keyof T];\n\nexport type QueryBuilder<T> = {\n equal: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n notEqual: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n lessThan: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n lessThanEqual: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n greaterThan: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n greaterThanEqual: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n contains: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n search: <K extends QueryableKeys<T>>(field: K, value: string) => string;\n isNull: <K extends QueryableKeys<T>>(field: K) => string;\n isNotNull: <K extends QueryableKeys<T>>(field: K) => string;\n startsWith: <K extends QueryableKeys<T>>(field: K, value: string) => string;\n endsWith: <K extends QueryableKeys<T>>(field: K, value: string) => string;\n between: <K extends QueryableKeys<T>>(field: K, start: ExtractQueryValue<T[K]>, end: ExtractQueryValue<T[K]>) => string;\n select: <K extends keyof T>(fields: K[]) => string;\n orderAsc: <K extends keyof T>(field: K) => string;\n orderDesc: <K extends keyof T>(field: K) => string;\n limit: (value: number) => string;\n offset: (value: number) => string;\n cursorAfter: (documentId: string) => string;\n cursorBefore: (documentId: string) => string;\n or: (...queries: string[]) => string;\n and: (...queries: string[]) => string;\n}\n\nexport type DatabaseId = {{{databaseIdType}}};\n\n{{{DATABASE_TABLES_TYPE}}}\n";
143745
143767
 
143746
143768
  // lib/commands/generators/typescript/templates/databases.ts.hbs
143747
- var databases_ts_default = 'import { Client, TablesDB, ID, Query, type Models, Permission, Role } from \'{{appwriteDep}}\';\nimport type { DatabaseHandle, DatabaseId, DatabaseTableMap, DatabaseTables, QueryBuilder, PermissionBuilder, RoleBuilder, RoleString } from \'./types.js\';\n{{#if supportsServerSide}}\nimport { PROJECT_ID, ENDPOINT, API_KEY } from \'./constants.js\';\n{{else}}\nimport { PROJECT_ID, ENDPOINT } from \'./constants.js\';\n{{/if}}\n\nconst createQueryBuilder = <T>(): QueryBuilder<T> => ({\n equal: (field, value) => Query.equal(String(field), value as any),\n notEqual: (field, value) => Query.notEqual(String(field), value as any),\n lessThan: (field, value) => Query.lessThan(String(field), value as any),\n lessThanEqual: (field, value) => Query.lessThanEqual(String(field), value as any),\n greaterThan: (field, value) => Query.greaterThan(String(field), value as any),\n greaterThanEqual: (field, value) => Query.greaterThanEqual(String(field), value as any),\n contains: (field, value) => Query.contains(String(field), value as any),\n search: (field, value) => Query.search(String(field), value),\n isNull: (field) => Query.isNull(String(field)),\n isNotNull: (field) => Query.isNotNull(String(field)),\n startsWith: (field, value) => Query.startsWith(String(field), value),\n endsWith: (field, value) => Query.endsWith(String(field), value),\n between: (field, start, end) => Query.between(String(field), start as any, end as any),\n select: (fields) => Query.select(fields.map(String)),\n orderAsc: (field) => Query.orderAsc(String(field)),\n orderDesc: (field) => Query.orderDesc(String(field)),\n limit: (value) => Query.limit(value),\n offset: (value) => Query.offset(value),\n cursorAfter: (documentId) => Query.cursorAfter(documentId),\n cursorBefore: (documentId) => Query.cursorBefore(documentId),\n or: (...queries) => Query.or(queries),\n and: (...queries) => Query.and(queries),\n});\n\n{{{TABLE_ID_MAP}}}\n\n{{{TABLES_WITH_RELATIONSHIPS}}}\n\nconst roleBuilder: RoleBuilder = {\n any: () => Role.any() as RoleString,\n user: (userId, status?) => Role.user(userId, status) as RoleString,\n users: (status?) => Role.users(status) as RoleString,\n guests: () => Role.guests() as RoleString,\n team: (teamId, role?) => Role.team(teamId, role) as RoleString,\n member: (memberId) => Role.member(memberId) as RoleString,\n label: (label) => Role.label(label) as RoleString,\n};\n\nconst permissionBuilder: PermissionBuilder = {\n read: (role) => Permission.read(role),\n write: (role) => Permission.write(role),\n create: (role) => Permission.create(role),\n update: (role) => Permission.update(role),\n delete: (role) => Permission.delete(role),\n};\n\nconst resolvePermissions = (callback?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]): string[] | undefined =>\n callback?.(permissionBuilder, roleBuilder);\n\nfunction createTableApi<T extends Models.Row>(\n tablesDB: TablesDB,\n databaseId: string,\n tableId: string,\n) {\n return {\n create: (data: any, options?: { rowId?: string; permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; transactionId?: string }) =>\n tablesDB.createRow<T>({\n databaseId,\n tableId,\n rowId: options?.rowId ?? ID.unique(),\n data,\n permissions: resolvePermissions(options?.permissions),\n transactionId: options?.transactionId,\n }),\n get: (id: string) =>\n tablesDB.getRow<T>({\n databaseId,\n tableId,\n rowId: id,\n }),\n update: (id: string, data: any, options?: { permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; transactionId?: string }) =>\n tablesDB.updateRow<T>({\n databaseId,\n tableId,\n rowId: id,\n data,\n ...(options?.permissions ? { permissions: resolvePermissions(options.permissions) } : {}),\n transactionId: options?.transactionId,\n }),\n delete: async (id: string, options?: { transactionId?: string }) => {\n await tablesDB.deleteRow({\n databaseId,\n tableId,\n rowId: id,\n transactionId: options?.transactionId,\n });\n },\n list: (options?: { queries?: (q: any) => string[] }) =>\n tablesDB.listRows<T>({\n databaseId,\n tableId,\n queries: options?.queries?.(createQueryBuilder<T>()),\n }),{{{BULK_METHODS}}}\n };\n}\n\n{{{BULK_CHECK}}}\nconst hasOwn = (obj: unknown, key: string): boolean =>\n obj != null && Object.prototype.hasOwnProperty.call(obj, key);\n\nfunction createDatabaseHandle<D extends DatabaseId>(\n tablesDB: TablesDB,\n databaseId: D,\n): DatabaseHandle<D> {\n const tableApiCache = new Map<string, unknown>();\n const dbMap = tableIdMap[databaseId];\n\n return {\n use: <T extends keyof DatabaseTableMap[D] & string>(tableId: T): DatabaseTableMap[D][T] => {\n if (!hasOwn(dbMap, tableId)) {\n throw new Error(`Unknown table "${tableId}" in database "${databaseId}"`);\n }\n\n if (!tableApiCache.has(tableId)) {\n const resolvedTableId = dbMap[tableId];\n const api = createTableApi(tablesDB, databaseId, resolvedTableId);\n {{{BULK_REMOVAL}}}\n tableApiCache.set(tableId, api);\n }\n return tableApiCache.get(tableId) as DatabaseTableMap[D][T];\n },\n{{#if supportsServerSide}}\n create: (tableId: string, name: string, options?: { permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; rowSecurity?: boolean; enabled?: boolean; columns?: any[]; indexes?: any[] }) =>\n tablesDB.createTable({\n databaseId,\n tableId,\n name,\n permissions: resolvePermissions(options?.permissions),\n rowSecurity: options?.rowSecurity,\n enabled: options?.enabled,\n columns: options?.columns,\n indexes: options?.indexes,\n }),\n update: (tableId: string, options?: { name?: string; permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; rowSecurity?: boolean; enabled?: boolean }) => {\n if (!hasOwn(dbMap, tableId)) {\n throw new Error(`Unknown table "${tableId}" in database "${databaseId}"`);\n }\n const resolvedTableId = dbMap[tableId];\n return tablesDB.updateTable({\n databaseId,\n tableId: resolvedTableId,\n name: options?.name ?? tableId, // TODO: remove this fallback once fixed in other SDKs\n permissions: resolvePermissions(options?.permissions),\n rowSecurity: options?.rowSecurity,\n enabled: options?.enabled,\n });\n },\n delete: async (tableId: string) => {\n if (!hasOwn(dbMap, tableId)) {\n throw new Error(`Unknown table "${tableId}" in database "${databaseId}"`);\n }\n const resolvedTableId = dbMap[tableId];\n await tablesDB.deleteTable({\n databaseId,\n tableId: resolvedTableId,\n });\n },\n{{/if}}\n };\n}\n\nfunction createDatabasesApi(tablesDB: TablesDB): DatabaseTables {\n const dbCache = new Map<DatabaseId, ReturnType<typeof createDatabaseHandle>>();\n\n return {\n use: (databaseId: DatabaseId) => {\n if (!hasOwn(tableIdMap, databaseId)) {\n throw new Error(`Unknown database "${databaseId}"`);\n }\n\n if (!dbCache.has(databaseId)) {\n dbCache.set(databaseId, createDatabaseHandle(tablesDB, databaseId));\n }\n return dbCache.get(databaseId);\n },\n{{#if supportsServerSide}}\n create: (databaseId: string, name: string, options?: { enabled?: boolean }) =>\n tablesDB.create({\n databaseId,\n name,\n enabled: options?.enabled,\n }),\n update: (databaseId: DatabaseId, options?: { name?: string; enabled?: boolean }) => {\n return tablesDB.update({\n databaseId,\n name: options?.name ?? databaseId,\n enabled: options?.enabled,\n });\n },\n delete: async (databaseId: DatabaseId) => {\n await tablesDB.delete({\n databaseId,\n });\n },\n{{/if}}\n } as DatabaseTables;\n}\n\n// Initialize client\nconst client = new Client()\n .setEndpoint(ENDPOINT)\n .setProject(PROJECT_ID){{#if supportsServerSide}}\n .setKey(API_KEY){{/if}};\n\nconst tablesDB = new TablesDB(client);\n\nexport const databases: DatabaseTables = createDatabasesApi(tablesDB);\n';
143769
+ var databases_ts_default = 'import { Client, TablesDB, ID, Query, type Models, Permission, Role } from \'{{appwriteDep}}\';\nimport type { DatabaseHandle, DatabaseId, DatabaseTableMap, DatabaseTables, QueryBuilder, PermissionBuilder, RoleBuilder, RoleString } from \'./types{{importExt}}\';\n{{#if supportsServerSide}}\nimport { PROJECT_ID, ENDPOINT, API_KEY } from \'./constants{{importExt}}\';\n{{else}}\nimport { PROJECT_ID, ENDPOINT } from \'./constants{{importExt}}\';\n{{/if}}\n\nconst createQueryBuilder = <T>(): QueryBuilder<T> => ({\n equal: (field, value) => Query.equal(String(field), value as any),\n notEqual: (field, value) => Query.notEqual(String(field), value as any),\n lessThan: (field, value) => Query.lessThan(String(field), value as any),\n lessThanEqual: (field, value) => Query.lessThanEqual(String(field), value as any),\n greaterThan: (field, value) => Query.greaterThan(String(field), value as any),\n greaterThanEqual: (field, value) => Query.greaterThanEqual(String(field), value as any),\n contains: (field, value) => Query.contains(String(field), value as any),\n search: (field, value) => Query.search(String(field), value),\n isNull: (field) => Query.isNull(String(field)),\n isNotNull: (field) => Query.isNotNull(String(field)),\n startsWith: (field, value) => Query.startsWith(String(field), value),\n endsWith: (field, value) => Query.endsWith(String(field), value),\n between: (field, start, end) => Query.between(String(field), start as any, end as any),\n select: (fields) => Query.select(fields.map(String)),\n orderAsc: (field) => Query.orderAsc(String(field)),\n orderDesc: (field) => Query.orderDesc(String(field)),\n limit: (value) => Query.limit(value),\n offset: (value) => Query.offset(value),\n cursorAfter: (documentId) => Query.cursorAfter(documentId),\n cursorBefore: (documentId) => Query.cursorBefore(documentId),\n or: (...queries) => Query.or(queries),\n and: (...queries) => Query.and(queries),\n});\n\n{{{TABLE_ID_MAP}}}\n\n{{{TABLES_WITH_RELATIONSHIPS}}}\n\nconst roleBuilder: RoleBuilder = {\n any: () => Role.any() as RoleString,\n user: (userId, status?) => Role.user(userId, status) as RoleString,\n users: (status?) => Role.users(status) as RoleString,\n guests: () => Role.guests() as RoleString,\n team: (teamId, role?) => Role.team(teamId, role) as RoleString,\n member: (memberId) => Role.member(memberId) as RoleString,\n label: (label) => Role.label(label) as RoleString,\n};\n\nconst permissionBuilder: PermissionBuilder = {\n read: (role) => Permission.read(role),\n write: (role) => Permission.write(role),\n create: (role) => Permission.create(role),\n update: (role) => Permission.update(role),\n delete: (role) => Permission.delete(role),\n};\n\nconst resolvePermissions = (callback?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]): string[] | undefined =>\n callback?.(permissionBuilder, roleBuilder);\n\nfunction createTableApi<T extends Models.Row>(\n tablesDB: TablesDB,\n databaseId: string,\n tableId: string,\n) {\n return {\n create: (data: any, options?: { rowId?: string; permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; transactionId?: string }) =>\n tablesDB.createRow<T>({\n databaseId,\n tableId,\n rowId: options?.rowId ?? ID.unique(),\n data,\n permissions: resolvePermissions(options?.permissions),\n transactionId: options?.transactionId,\n }),\n get: (id: string) =>\n tablesDB.getRow<T>({\n databaseId,\n tableId,\n rowId: id,\n }),\n update: (id: string, data: any, options?: { permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; transactionId?: string }) =>\n tablesDB.updateRow<T>({\n databaseId,\n tableId,\n rowId: id,\n data,\n ...(options?.permissions ? { permissions: resolvePermissions(options.permissions) } : {}),\n transactionId: options?.transactionId,\n }),\n delete: async (id: string, options?: { transactionId?: string }) => {\n await tablesDB.deleteRow({\n databaseId,\n tableId,\n rowId: id,\n transactionId: options?.transactionId,\n });\n },\n list: (options?: { queries?: (q: any) => string[] }) =>\n tablesDB.listRows<T>({\n databaseId,\n tableId,\n queries: options?.queries?.(createQueryBuilder<T>()),\n }),{{{BULK_METHODS}}}\n };\n}\n\n{{{BULK_CHECK}}}\nconst hasOwn = (obj: unknown, key: string): boolean =>\n obj != null && Object.prototype.hasOwnProperty.call(obj, key);\n\nfunction createDatabaseHandle<D extends DatabaseId>(\n tablesDB: TablesDB,\n databaseId: D,\n): DatabaseHandle<D> {\n const tableApiCache = new Map<string, unknown>();\n const dbMap = tableIdMap[databaseId];\n\n return {\n use: <T extends keyof DatabaseTableMap[D] & string>(tableId: T): DatabaseTableMap[D][T] => {\n if (!hasOwn(dbMap, tableId)) {\n throw new Error(`Unknown table "${tableId}" in database "${databaseId}"`);\n }\n\n if (!tableApiCache.has(tableId)) {\n const resolvedTableId = dbMap[tableId];\n const api = createTableApi(tablesDB, databaseId, resolvedTableId);\n {{{BULK_REMOVAL}}}\n tableApiCache.set(tableId, api);\n }\n return tableApiCache.get(tableId) as DatabaseTableMap[D][T];\n },\n{{#if supportsServerSide}}\n create: (tableId: string, name: string, options?: { permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; rowSecurity?: boolean; enabled?: boolean; columns?: any[]; indexes?: any[] }) =>\n tablesDB.createTable({\n databaseId,\n tableId,\n name,\n permissions: resolvePermissions(options?.permissions),\n rowSecurity: options?.rowSecurity,\n enabled: options?.enabled,\n columns: options?.columns,\n indexes: options?.indexes,\n }),\n update: (tableId: string, options?: { name?: string; permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; rowSecurity?: boolean; enabled?: boolean }) => {\n if (!hasOwn(dbMap, tableId)) {\n throw new Error(`Unknown table "${tableId}" in database "${databaseId}"`);\n }\n const resolvedTableId = dbMap[tableId];\n return tablesDB.updateTable({\n databaseId,\n tableId: resolvedTableId,\n name: options?.name ?? tableId, // TODO: remove this fallback once fixed in other SDKs\n permissions: resolvePermissions(options?.permissions),\n rowSecurity: options?.rowSecurity,\n enabled: options?.enabled,\n });\n },\n delete: async (tableId: string) => {\n if (!hasOwn(dbMap, tableId)) {\n throw new Error(`Unknown table "${tableId}" in database "${databaseId}"`);\n }\n const resolvedTableId = dbMap[tableId];\n await tablesDB.deleteTable({\n databaseId,\n tableId: resolvedTableId,\n });\n },\n{{/if}}\n };\n}\n\nfunction createDatabasesApi(tablesDB: TablesDB): DatabaseTables {\n const dbCache = new Map<DatabaseId, ReturnType<typeof createDatabaseHandle>>();\n\n return {\n use: (databaseId: DatabaseId) => {\n if (!hasOwn(tableIdMap, databaseId)) {\n throw new Error(`Unknown database "${databaseId}"`);\n }\n\n if (!dbCache.has(databaseId)) {\n dbCache.set(databaseId, createDatabaseHandle(tablesDB, databaseId));\n }\n return dbCache.get(databaseId);\n },\n{{#if supportsServerSide}}\n create: (databaseId: string, name: string, options?: { enabled?: boolean }) =>\n tablesDB.create({\n databaseId,\n name,\n enabled: options?.enabled,\n }),\n update: (databaseId: DatabaseId, options?: { name?: string; enabled?: boolean }) => {\n return tablesDB.update({\n databaseId,\n name: options?.name ?? databaseId,\n enabled: options?.enabled,\n });\n },\n delete: async (databaseId: DatabaseId) => {\n await tablesDB.delete({\n databaseId,\n });\n },\n{{/if}}\n } as DatabaseTables;\n}\n\n// Initialize client\nconst client = new Client()\n .setEndpoint(ENDPOINT)\n .setProject(PROJECT_ID){{#if supportsServerSide}}\n .setKey(API_KEY){{/if}};\n\nconst tablesDB = new TablesDB(client);\n\nexport const databases: DatabaseTables = createDatabasesApi(tablesDB);\n';
143748
143770
 
143749
143771
  // lib/commands/generators/typescript/templates/index.ts.hbs
143750
- var index_ts_default = '/**\n * {{sdkTitle}} Generated SDK\n *\n * This file is auto-generated. Do not edit manually.\n * Re-run `{{executableName}} generate` to regenerate.\n */\n\nexport { databases } from "./databases.js";\nexport * from "./types.js";\n';
143772
+ var index_ts_default = '/**\n * {{sdkTitle}} Generated SDK\n *\n * This file is auto-generated. Do not edit manually.\n * Re-run `{{executableName}} generate` to regenerate.\n */\n\nexport { databases } from "./databases{{importExt}}";\nexport * from "./types{{importExt}}";\n';
143751
143773
 
143752
143774
  // lib/commands/generators/typescript/templates/constants.ts.hbs
143753
143775
  var constants_ts_default = "/**\n * {{sdkTitle}} Configuration Constants\n *\n * This file contains configuration for the generated SDK.\n * You may modify these values as needed.\n */\n\nexport const PROJECT_ID = '{{projectId}}';\nexport const ENDPOINT = '{{endpoint}}';\n{{#if requiresApiKey}}\n\n/**\n * API Key is required for server-side operations\n * Set the APPWRITE_API_KEY environment variable or replace this value directly.\n */\nexport const API_KEY = process.env.APPWRITE_API_KEY ?? '';\n{{/if}}\n";
@@ -144016,7 +144038,7 @@ ${supportsServerSide ? ` create: (databaseId: string, name: string, options?: {
144016
144038
  delete (api as any).deleteMany;
144017
144039
  }`;
144018
144040
  }
144019
- generateDatabasesFile(config2) {
144041
+ generateDatabasesFile(config2, importExt) {
144020
144042
  const entities = config2.tables?.length ? config2.tables : config2.collections;
144021
144043
  if (!entities || entities.length === 0) {
144022
144044
  return "// No tables or collections found in configuration\n";
@@ -144030,6 +144052,7 @@ ${supportsServerSide ? ` create: (databaseId: string, name: string, options?: {
144030
144052
  return databasesTemplate({
144031
144053
  appwriteDep,
144032
144054
  supportsServerSide,
144055
+ importExt,
144033
144056
  TABLE_ID_MAP: this.generateTableIdMap(entitiesByDb),
144034
144057
  TABLES_WITH_RELATIONSHIPS: this.generateTablesWithRelationships(entitiesByDb),
144035
144058
  BULK_METHODS: this.generateBulkMethods(supportsServerSide),
@@ -144037,10 +144060,11 @@ ${supportsServerSide ? ` create: (databaseId: string, name: string, options?: {
144037
144060
  BULK_REMOVAL: this.generateBulkRemoval(supportsServerSide)
144038
144061
  });
144039
144062
  }
144040
- generateIndexFile() {
144063
+ generateIndexFile(importExt) {
144041
144064
  return indexTemplate({
144042
144065
  sdkTitle: SDK_TITLE,
144043
- executableName: EXECUTABLE_NAME
144066
+ executableName: EXECUTABLE_NAME,
144067
+ importExt
144044
144068
  });
144045
144069
  }
144046
144070
  generateConstantsFile(config2) {
@@ -144060,6 +144084,7 @@ ${supportsServerSide ? ` create: (databaseId: string, name: string, options?: {
144060
144084
  if (!config2.projectId) {
144061
144085
  throw new Error("Project ID is required in configuration");
144062
144086
  }
144087
+ const importExt = detectImportExtension();
144063
144088
  const files = /* @__PURE__ */ new Map();
144064
144089
  const hasEntities = config2.tables && config2.tables.length > 0 || config2.collections && config2.collections.length > 0;
144065
144090
  if (!hasEntities) {
@@ -144074,13 +144099,13 @@ ${supportsServerSide ? ` create: (databaseId: string, name: string, options?: {
144074
144099
  "types.ts",
144075
144100
  "// No tables or collections found in configuration\n"
144076
144101
  );
144077
- files.set("index.ts", this.generateIndexFile());
144102
+ files.set("index.ts", this.generateIndexFile(importExt));
144078
144103
  files.set("constants.ts", this.generateConstantsFile(config2));
144079
144104
  return { files };
144080
144105
  }
144081
144106
  files.set("types.ts", this.generateTypesFile(config2));
144082
- files.set("databases.ts", this.generateDatabasesFile(config2));
144083
- files.set("index.ts", this.generateIndexFile());
144107
+ files.set("databases.ts", this.generateDatabasesFile(config2, importExt));
144108
+ files.set("index.ts", this.generateIndexFile(importExt));
144084
144109
  files.set("constants.ts", this.generateConstantsFile(config2));
144085
144110
  return { files };
144086
144111
  }
@@ -144199,10 +144224,11 @@ Use --language to specify the target language. Supported: ${supported}`
144199
144224
  const firstEntity = entities?.[0];
144200
144225
  const dbId = firstEntity?.databaseId ?? "databaseId";
144201
144226
  const tableName = firstEntity?.name ?? "tableName";
144227
+ const importExt = detectImportExtension();
144202
144228
  console.log("");
144203
144229
  log(`Import the generated SDK in your project:`);
144204
144230
  console.log(
144205
- ` import { databases } from "./${outputDir}/${SDK_TITLE_LOWER}/index.js";`
144231
+ ` import { databases } from "./${outputDir}/${SDK_TITLE_LOWER}/index${importExt}";`
144206
144232
  );
144207
144233
  console.log("");
144208
144234
  log(`Configure your SDK constants:`);
@@ -144239,7 +144265,7 @@ var generate = new Command("generate").description(
144239
144265
  `
144240
144266
  Example:
144241
144267
  Import the generated SDK in your project:
144242
- import { databases } from "./generated/${SDK_TITLE_LOWER}/index.js";
144268
+ import { databases } from "./generated/${SDK_TITLE_LOWER}/index${detectImportExtension()}";
144243
144269
 
144244
144270
  Configure your SDK constants:
144245
144271
  set values in ./generated/${SDK_TITLE_LOWER}/constants.ts
@@ -147975,9 +148001,6 @@ if (process.argv.includes("-v") || process.argv.includes("--version")) {
147975
148001
  }
147976
148002
  /*! Bundled license information:
147977
148003
 
147978
- safe-buffer/index.js:
147979
- (*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> *)
147980
-
147981
148004
  undici/lib/fetch/body.js:
147982
148005
  (*! formdata-polyfill. MIT License. Jimmy Wärting <https://jimmy.warting.se/opensource> *)
147983
148006
 
package/dist/cli.cjs CHANGED
@@ -21975,7 +21975,6 @@ var require_safe_buffer = __commonJS({
21975
21975
  function SafeBuffer(arg, encodingOrOffset, length) {
21976
21976
  return Buffer2(arg, encodingOrOffset, length);
21977
21977
  }
21978
- SafeBuffer.prototype = Object.create(Buffer2.prototype);
21979
21978
  copyProps(Buffer2, SafeBuffer);
21980
21979
  SafeBuffer.from = function(arg, encodingOrOffset, length) {
21981
21980
  if (typeof arg === "number") {
@@ -93392,7 +93391,7 @@ var package_default = {
93392
93391
  type: "module",
93393
93392
  homepage: "https://appwrite.io/support",
93394
93393
  description: "Appwrite is an open-source self-hosted backend server that abstracts and simplifies complex and repetitive development tasks behind a very simple REST API",
93395
- version: "13.3.0",
93394
+ version: "13.3.2",
93396
93395
  license: "BSD-3-Clause",
93397
93396
  main: "dist/index.js",
93398
93397
  types: "dist/index.d.ts",
@@ -107656,7 +107655,7 @@ var import_undici = __toESM(require_undici(), 1);
107656
107655
  // lib/constants.ts
107657
107656
  var SDK_TITLE = "Appwrite";
107658
107657
  var SDK_TITLE_LOWER = "appwrite";
107659
- var SDK_VERSION = "13.3.0";
107658
+ var SDK_VERSION = "13.3.2";
107660
107659
  var SDK_NAME = "Command Line";
107661
107660
  var SDK_PLATFORM = "console";
107662
107661
  var SDK_LANGUAGE = "cli";
@@ -134302,14 +134301,21 @@ var drawTable = (data) => {
134302
134301
  console.log("[]");
134303
134302
  return;
134304
134303
  }
134305
- const obj = data.reduce((res, item) => ({ ...res, ...item }), {});
134304
+ const rows = data.map(
134305
+ (item) => item && typeof item === "object" && !Array.isArray(item) ? item : {}
134306
+ );
134307
+ const obj = rows.reduce((res, item) => ({ ...res, ...item }), {});
134306
134308
  const keys = Object.keys(obj);
134309
+ if (keys.length === 0) {
134310
+ drawJSON(data);
134311
+ return;
134312
+ }
134307
134313
  const def = keys.reduce((result, key) => {
134308
134314
  result[key] = "-";
134309
134315
  return result;
134310
134316
  }, {});
134311
- data = data.map((item) => ({ ...def, ...item }));
134312
- const columns = Object.keys(data[0]);
134317
+ const normalizedData = rows.map((item) => ({ ...def, ...item }));
134318
+ const columns = Object.keys(normalizedData[0]);
134313
134319
  const table = new import_cli_table3.default({
134314
134320
  head: columns.map((c) => import_chalk.default.cyan.italic.bold(c)),
134315
134321
  chars: {
@@ -134330,10 +134336,10 @@ var drawTable = (data) => {
134330
134336
  middle: import_chalk.default.cyan("\u2502")
134331
134337
  }
134332
134338
  });
134333
- data.forEach((row) => {
134339
+ normalizedData.forEach((row) => {
134334
134340
  const rowValues = [];
134335
- for (const key in row) {
134336
- if (row[key] === null) {
134341
+ for (const key of columns) {
134342
+ if (row[key] == null) {
134337
134343
  rowValues.push("-");
134338
134344
  } else if (Array.isArray(row[key])) {
134339
134345
  rowValues.push(JSON.stringify(row[key]));
@@ -138152,6 +138158,22 @@ function getAppwriteDependency() {
138152
138158
  }
138153
138159
  return "appwrite";
138154
138160
  }
138161
+ function detectImportExtension(cwd = process.cwd()) {
138162
+ try {
138163
+ const pkgPath = path6.resolve(cwd, "package.json");
138164
+ if (fs7.existsSync(pkgPath)) {
138165
+ const pkg = JSON.parse(fs7.readFileSync(pkgPath, "utf-8"));
138166
+ if (pkg.type === "module") {
138167
+ return ".js";
138168
+ }
138169
+ }
138170
+ if (fs7.existsSync(path6.resolve(cwd, "deno.json")) || fs7.existsSync(path6.resolve(cwd, "deno.jsonc"))) {
138171
+ return ".ts";
138172
+ }
138173
+ } catch {
138174
+ }
138175
+ return "";
138176
+ }
138155
138177
  function supportsServerSideMethods(appwriteDep, override = "auto") {
138156
138178
  if (override === "true") return true;
138157
138179
  if (override === "false") return false;
@@ -143738,10 +143760,10 @@ var BaseDatabasesGenerator = class {
143738
143760
  var types_ts_default = "import { type Models } from '{{appwriteDep}}';\n\n{{{ENUMS}}}{{{TYPES}}}\ndeclare const __roleStringBrand: unique symbol;\nexport type RoleString = string & { readonly [__roleStringBrand]: never };\n\nexport type RoleBuilder = {\n any: () => RoleString;\n user: (userId: string, status?: string) => RoleString;\n users: (status?: string) => RoleString;\n guests: () => RoleString;\n team: (teamId: string, role?: string) => RoleString;\n member: (memberId: string) => RoleString;\n label: (label: string) => RoleString;\n}\n\nexport type PermissionBuilder = {\n read: (role: RoleString) => string;\n write: (role: RoleString) => string;\n create: (role: RoleString) => string;\n update: (role: RoleString) => string;\n delete: (role: RoleString) => string;\n}\n\nexport type PermissionCallback = (permission: PermissionBuilder, role: RoleBuilder) => string[];\n\nexport type QueryValue = string | number | boolean;\n\nexport type ExtractQueryValue<T> = T extends (infer U)[]\n ? U extends QueryValue ? U : never\n : T extends QueryValue | null ? NonNullable<T> : never;\n\nexport type QueryableKeys<T> = {\n [K in keyof T]: ExtractQueryValue<T[K]> extends never ? never : K;\n}[keyof T];\n\nexport type QueryBuilder<T> = {\n equal: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n notEqual: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n lessThan: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n lessThanEqual: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n greaterThan: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n greaterThanEqual: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n contains: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n search: <K extends QueryableKeys<T>>(field: K, value: string) => string;\n isNull: <K extends QueryableKeys<T>>(field: K) => string;\n isNotNull: <K extends QueryableKeys<T>>(field: K) => string;\n startsWith: <K extends QueryableKeys<T>>(field: K, value: string) => string;\n endsWith: <K extends QueryableKeys<T>>(field: K, value: string) => string;\n between: <K extends QueryableKeys<T>>(field: K, start: ExtractQueryValue<T[K]>, end: ExtractQueryValue<T[K]>) => string;\n select: <K extends keyof T>(fields: K[]) => string;\n orderAsc: <K extends keyof T>(field: K) => string;\n orderDesc: <K extends keyof T>(field: K) => string;\n limit: (value: number) => string;\n offset: (value: number) => string;\n cursorAfter: (documentId: string) => string;\n cursorBefore: (documentId: string) => string;\n or: (...queries: string[]) => string;\n and: (...queries: string[]) => string;\n}\n\nexport type DatabaseId = {{{databaseIdType}}};\n\n{{{DATABASE_TABLES_TYPE}}}\n";
143739
143761
 
143740
143762
  // lib/commands/generators/typescript/templates/databases.ts.hbs
143741
- var databases_ts_default = 'import { Client, TablesDB, ID, Query, type Models, Permission, Role } from \'{{appwriteDep}}\';\nimport type { DatabaseHandle, DatabaseId, DatabaseTableMap, DatabaseTables, QueryBuilder, PermissionBuilder, RoleBuilder, RoleString } from \'./types.js\';\n{{#if supportsServerSide}}\nimport { PROJECT_ID, ENDPOINT, API_KEY } from \'./constants.js\';\n{{else}}\nimport { PROJECT_ID, ENDPOINT } from \'./constants.js\';\n{{/if}}\n\nconst createQueryBuilder = <T>(): QueryBuilder<T> => ({\n equal: (field, value) => Query.equal(String(field), value as any),\n notEqual: (field, value) => Query.notEqual(String(field), value as any),\n lessThan: (field, value) => Query.lessThan(String(field), value as any),\n lessThanEqual: (field, value) => Query.lessThanEqual(String(field), value as any),\n greaterThan: (field, value) => Query.greaterThan(String(field), value as any),\n greaterThanEqual: (field, value) => Query.greaterThanEqual(String(field), value as any),\n contains: (field, value) => Query.contains(String(field), value as any),\n search: (field, value) => Query.search(String(field), value),\n isNull: (field) => Query.isNull(String(field)),\n isNotNull: (field) => Query.isNotNull(String(field)),\n startsWith: (field, value) => Query.startsWith(String(field), value),\n endsWith: (field, value) => Query.endsWith(String(field), value),\n between: (field, start, end) => Query.between(String(field), start as any, end as any),\n select: (fields) => Query.select(fields.map(String)),\n orderAsc: (field) => Query.orderAsc(String(field)),\n orderDesc: (field) => Query.orderDesc(String(field)),\n limit: (value) => Query.limit(value),\n offset: (value) => Query.offset(value),\n cursorAfter: (documentId) => Query.cursorAfter(documentId),\n cursorBefore: (documentId) => Query.cursorBefore(documentId),\n or: (...queries) => Query.or(queries),\n and: (...queries) => Query.and(queries),\n});\n\n{{{TABLE_ID_MAP}}}\n\n{{{TABLES_WITH_RELATIONSHIPS}}}\n\nconst roleBuilder: RoleBuilder = {\n any: () => Role.any() as RoleString,\n user: (userId, status?) => Role.user(userId, status) as RoleString,\n users: (status?) => Role.users(status) as RoleString,\n guests: () => Role.guests() as RoleString,\n team: (teamId, role?) => Role.team(teamId, role) as RoleString,\n member: (memberId) => Role.member(memberId) as RoleString,\n label: (label) => Role.label(label) as RoleString,\n};\n\nconst permissionBuilder: PermissionBuilder = {\n read: (role) => Permission.read(role),\n write: (role) => Permission.write(role),\n create: (role) => Permission.create(role),\n update: (role) => Permission.update(role),\n delete: (role) => Permission.delete(role),\n};\n\nconst resolvePermissions = (callback?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]): string[] | undefined =>\n callback?.(permissionBuilder, roleBuilder);\n\nfunction createTableApi<T extends Models.Row>(\n tablesDB: TablesDB,\n databaseId: string,\n tableId: string,\n) {\n return {\n create: (data: any, options?: { rowId?: string; permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; transactionId?: string }) =>\n tablesDB.createRow<T>({\n databaseId,\n tableId,\n rowId: options?.rowId ?? ID.unique(),\n data,\n permissions: resolvePermissions(options?.permissions),\n transactionId: options?.transactionId,\n }),\n get: (id: string) =>\n tablesDB.getRow<T>({\n databaseId,\n tableId,\n rowId: id,\n }),\n update: (id: string, data: any, options?: { permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; transactionId?: string }) =>\n tablesDB.updateRow<T>({\n databaseId,\n tableId,\n rowId: id,\n data,\n ...(options?.permissions ? { permissions: resolvePermissions(options.permissions) } : {}),\n transactionId: options?.transactionId,\n }),\n delete: async (id: string, options?: { transactionId?: string }) => {\n await tablesDB.deleteRow({\n databaseId,\n tableId,\n rowId: id,\n transactionId: options?.transactionId,\n });\n },\n list: (options?: { queries?: (q: any) => string[] }) =>\n tablesDB.listRows<T>({\n databaseId,\n tableId,\n queries: options?.queries?.(createQueryBuilder<T>()),\n }),{{{BULK_METHODS}}}\n };\n}\n\n{{{BULK_CHECK}}}\nconst hasOwn = (obj: unknown, key: string): boolean =>\n obj != null && Object.prototype.hasOwnProperty.call(obj, key);\n\nfunction createDatabaseHandle<D extends DatabaseId>(\n tablesDB: TablesDB,\n databaseId: D,\n): DatabaseHandle<D> {\n const tableApiCache = new Map<string, unknown>();\n const dbMap = tableIdMap[databaseId];\n\n return {\n use: <T extends keyof DatabaseTableMap[D] & string>(tableId: T): DatabaseTableMap[D][T] => {\n if (!hasOwn(dbMap, tableId)) {\n throw new Error(`Unknown table "${tableId}" in database "${databaseId}"`);\n }\n\n if (!tableApiCache.has(tableId)) {\n const resolvedTableId = dbMap[tableId];\n const api = createTableApi(tablesDB, databaseId, resolvedTableId);\n {{{BULK_REMOVAL}}}\n tableApiCache.set(tableId, api);\n }\n return tableApiCache.get(tableId) as DatabaseTableMap[D][T];\n },\n{{#if supportsServerSide}}\n create: (tableId: string, name: string, options?: { permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; rowSecurity?: boolean; enabled?: boolean; columns?: any[]; indexes?: any[] }) =>\n tablesDB.createTable({\n databaseId,\n tableId,\n name,\n permissions: resolvePermissions(options?.permissions),\n rowSecurity: options?.rowSecurity,\n enabled: options?.enabled,\n columns: options?.columns,\n indexes: options?.indexes,\n }),\n update: (tableId: string, options?: { name?: string; permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; rowSecurity?: boolean; enabled?: boolean }) => {\n if (!hasOwn(dbMap, tableId)) {\n throw new Error(`Unknown table "${tableId}" in database "${databaseId}"`);\n }\n const resolvedTableId = dbMap[tableId];\n return tablesDB.updateTable({\n databaseId,\n tableId: resolvedTableId,\n name: options?.name ?? tableId, // TODO: remove this fallback once fixed in other SDKs\n permissions: resolvePermissions(options?.permissions),\n rowSecurity: options?.rowSecurity,\n enabled: options?.enabled,\n });\n },\n delete: async (tableId: string) => {\n if (!hasOwn(dbMap, tableId)) {\n throw new Error(`Unknown table "${tableId}" in database "${databaseId}"`);\n }\n const resolvedTableId = dbMap[tableId];\n await tablesDB.deleteTable({\n databaseId,\n tableId: resolvedTableId,\n });\n },\n{{/if}}\n };\n}\n\nfunction createDatabasesApi(tablesDB: TablesDB): DatabaseTables {\n const dbCache = new Map<DatabaseId, ReturnType<typeof createDatabaseHandle>>();\n\n return {\n use: (databaseId: DatabaseId) => {\n if (!hasOwn(tableIdMap, databaseId)) {\n throw new Error(`Unknown database "${databaseId}"`);\n }\n\n if (!dbCache.has(databaseId)) {\n dbCache.set(databaseId, createDatabaseHandle(tablesDB, databaseId));\n }\n return dbCache.get(databaseId);\n },\n{{#if supportsServerSide}}\n create: (databaseId: string, name: string, options?: { enabled?: boolean }) =>\n tablesDB.create({\n databaseId,\n name,\n enabled: options?.enabled,\n }),\n update: (databaseId: DatabaseId, options?: { name?: string; enabled?: boolean }) => {\n return tablesDB.update({\n databaseId,\n name: options?.name ?? databaseId,\n enabled: options?.enabled,\n });\n },\n delete: async (databaseId: DatabaseId) => {\n await tablesDB.delete({\n databaseId,\n });\n },\n{{/if}}\n } as DatabaseTables;\n}\n\n// Initialize client\nconst client = new Client()\n .setEndpoint(ENDPOINT)\n .setProject(PROJECT_ID){{#if supportsServerSide}}\n .setKey(API_KEY){{/if}};\n\nconst tablesDB = new TablesDB(client);\n\nexport const databases: DatabaseTables = createDatabasesApi(tablesDB);\n';
143763
+ var databases_ts_default = 'import { Client, TablesDB, ID, Query, type Models, Permission, Role } from \'{{appwriteDep}}\';\nimport type { DatabaseHandle, DatabaseId, DatabaseTableMap, DatabaseTables, QueryBuilder, PermissionBuilder, RoleBuilder, RoleString } from \'./types{{importExt}}\';\n{{#if supportsServerSide}}\nimport { PROJECT_ID, ENDPOINT, API_KEY } from \'./constants{{importExt}}\';\n{{else}}\nimport { PROJECT_ID, ENDPOINT } from \'./constants{{importExt}}\';\n{{/if}}\n\nconst createQueryBuilder = <T>(): QueryBuilder<T> => ({\n equal: (field, value) => Query.equal(String(field), value as any),\n notEqual: (field, value) => Query.notEqual(String(field), value as any),\n lessThan: (field, value) => Query.lessThan(String(field), value as any),\n lessThanEqual: (field, value) => Query.lessThanEqual(String(field), value as any),\n greaterThan: (field, value) => Query.greaterThan(String(field), value as any),\n greaterThanEqual: (field, value) => Query.greaterThanEqual(String(field), value as any),\n contains: (field, value) => Query.contains(String(field), value as any),\n search: (field, value) => Query.search(String(field), value),\n isNull: (field) => Query.isNull(String(field)),\n isNotNull: (field) => Query.isNotNull(String(field)),\n startsWith: (field, value) => Query.startsWith(String(field), value),\n endsWith: (field, value) => Query.endsWith(String(field), value),\n between: (field, start, end) => Query.between(String(field), start as any, end as any),\n select: (fields) => Query.select(fields.map(String)),\n orderAsc: (field) => Query.orderAsc(String(field)),\n orderDesc: (field) => Query.orderDesc(String(field)),\n limit: (value) => Query.limit(value),\n offset: (value) => Query.offset(value),\n cursorAfter: (documentId) => Query.cursorAfter(documentId),\n cursorBefore: (documentId) => Query.cursorBefore(documentId),\n or: (...queries) => Query.or(queries),\n and: (...queries) => Query.and(queries),\n});\n\n{{{TABLE_ID_MAP}}}\n\n{{{TABLES_WITH_RELATIONSHIPS}}}\n\nconst roleBuilder: RoleBuilder = {\n any: () => Role.any() as RoleString,\n user: (userId, status?) => Role.user(userId, status) as RoleString,\n users: (status?) => Role.users(status) as RoleString,\n guests: () => Role.guests() as RoleString,\n team: (teamId, role?) => Role.team(teamId, role) as RoleString,\n member: (memberId) => Role.member(memberId) as RoleString,\n label: (label) => Role.label(label) as RoleString,\n};\n\nconst permissionBuilder: PermissionBuilder = {\n read: (role) => Permission.read(role),\n write: (role) => Permission.write(role),\n create: (role) => Permission.create(role),\n update: (role) => Permission.update(role),\n delete: (role) => Permission.delete(role),\n};\n\nconst resolvePermissions = (callback?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]): string[] | undefined =>\n callback?.(permissionBuilder, roleBuilder);\n\nfunction createTableApi<T extends Models.Row>(\n tablesDB: TablesDB,\n databaseId: string,\n tableId: string,\n) {\n return {\n create: (data: any, options?: { rowId?: string; permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; transactionId?: string }) =>\n tablesDB.createRow<T>({\n databaseId,\n tableId,\n rowId: options?.rowId ?? ID.unique(),\n data,\n permissions: resolvePermissions(options?.permissions),\n transactionId: options?.transactionId,\n }),\n get: (id: string) =>\n tablesDB.getRow<T>({\n databaseId,\n tableId,\n rowId: id,\n }),\n update: (id: string, data: any, options?: { permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; transactionId?: string }) =>\n tablesDB.updateRow<T>({\n databaseId,\n tableId,\n rowId: id,\n data,\n ...(options?.permissions ? { permissions: resolvePermissions(options.permissions) } : {}),\n transactionId: options?.transactionId,\n }),\n delete: async (id: string, options?: { transactionId?: string }) => {\n await tablesDB.deleteRow({\n databaseId,\n tableId,\n rowId: id,\n transactionId: options?.transactionId,\n });\n },\n list: (options?: { queries?: (q: any) => string[] }) =>\n tablesDB.listRows<T>({\n databaseId,\n tableId,\n queries: options?.queries?.(createQueryBuilder<T>()),\n }),{{{BULK_METHODS}}}\n };\n}\n\n{{{BULK_CHECK}}}\nconst hasOwn = (obj: unknown, key: string): boolean =>\n obj != null && Object.prototype.hasOwnProperty.call(obj, key);\n\nfunction createDatabaseHandle<D extends DatabaseId>(\n tablesDB: TablesDB,\n databaseId: D,\n): DatabaseHandle<D> {\n const tableApiCache = new Map<string, unknown>();\n const dbMap = tableIdMap[databaseId];\n\n return {\n use: <T extends keyof DatabaseTableMap[D] & string>(tableId: T): DatabaseTableMap[D][T] => {\n if (!hasOwn(dbMap, tableId)) {\n throw new Error(`Unknown table "${tableId}" in database "${databaseId}"`);\n }\n\n if (!tableApiCache.has(tableId)) {\n const resolvedTableId = dbMap[tableId];\n const api = createTableApi(tablesDB, databaseId, resolvedTableId);\n {{{BULK_REMOVAL}}}\n tableApiCache.set(tableId, api);\n }\n return tableApiCache.get(tableId) as DatabaseTableMap[D][T];\n },\n{{#if supportsServerSide}}\n create: (tableId: string, name: string, options?: { permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; rowSecurity?: boolean; enabled?: boolean; columns?: any[]; indexes?: any[] }) =>\n tablesDB.createTable({\n databaseId,\n tableId,\n name,\n permissions: resolvePermissions(options?.permissions),\n rowSecurity: options?.rowSecurity,\n enabled: options?.enabled,\n columns: options?.columns,\n indexes: options?.indexes,\n }),\n update: (tableId: string, options?: { name?: string; permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; rowSecurity?: boolean; enabled?: boolean }) => {\n if (!hasOwn(dbMap, tableId)) {\n throw new Error(`Unknown table "${tableId}" in database "${databaseId}"`);\n }\n const resolvedTableId = dbMap[tableId];\n return tablesDB.updateTable({\n databaseId,\n tableId: resolvedTableId,\n name: options?.name ?? tableId, // TODO: remove this fallback once fixed in other SDKs\n permissions: resolvePermissions(options?.permissions),\n rowSecurity: options?.rowSecurity,\n enabled: options?.enabled,\n });\n },\n delete: async (tableId: string) => {\n if (!hasOwn(dbMap, tableId)) {\n throw new Error(`Unknown table "${tableId}" in database "${databaseId}"`);\n }\n const resolvedTableId = dbMap[tableId];\n await tablesDB.deleteTable({\n databaseId,\n tableId: resolvedTableId,\n });\n },\n{{/if}}\n };\n}\n\nfunction createDatabasesApi(tablesDB: TablesDB): DatabaseTables {\n const dbCache = new Map<DatabaseId, ReturnType<typeof createDatabaseHandle>>();\n\n return {\n use: (databaseId: DatabaseId) => {\n if (!hasOwn(tableIdMap, databaseId)) {\n throw new Error(`Unknown database "${databaseId}"`);\n }\n\n if (!dbCache.has(databaseId)) {\n dbCache.set(databaseId, createDatabaseHandle(tablesDB, databaseId));\n }\n return dbCache.get(databaseId);\n },\n{{#if supportsServerSide}}\n create: (databaseId: string, name: string, options?: { enabled?: boolean }) =>\n tablesDB.create({\n databaseId,\n name,\n enabled: options?.enabled,\n }),\n update: (databaseId: DatabaseId, options?: { name?: string; enabled?: boolean }) => {\n return tablesDB.update({\n databaseId,\n name: options?.name ?? databaseId,\n enabled: options?.enabled,\n });\n },\n delete: async (databaseId: DatabaseId) => {\n await tablesDB.delete({\n databaseId,\n });\n },\n{{/if}}\n } as DatabaseTables;\n}\n\n// Initialize client\nconst client = new Client()\n .setEndpoint(ENDPOINT)\n .setProject(PROJECT_ID){{#if supportsServerSide}}\n .setKey(API_KEY){{/if}};\n\nconst tablesDB = new TablesDB(client);\n\nexport const databases: DatabaseTables = createDatabasesApi(tablesDB);\n';
143742
143764
 
143743
143765
  // lib/commands/generators/typescript/templates/index.ts.hbs
143744
- var index_ts_default = '/**\n * {{sdkTitle}} Generated SDK\n *\n * This file is auto-generated. Do not edit manually.\n * Re-run `{{executableName}} generate` to regenerate.\n */\n\nexport { databases } from "./databases.js";\nexport * from "./types.js";\n';
143766
+ var index_ts_default = '/**\n * {{sdkTitle}} Generated SDK\n *\n * This file is auto-generated. Do not edit manually.\n * Re-run `{{executableName}} generate` to regenerate.\n */\n\nexport { databases } from "./databases{{importExt}}";\nexport * from "./types{{importExt}}";\n';
143745
143767
 
143746
143768
  // lib/commands/generators/typescript/templates/constants.ts.hbs
143747
143769
  var constants_ts_default = "/**\n * {{sdkTitle}} Configuration Constants\n *\n * This file contains configuration for the generated SDK.\n * You may modify these values as needed.\n */\n\nexport const PROJECT_ID = '{{projectId}}';\nexport const ENDPOINT = '{{endpoint}}';\n{{#if requiresApiKey}}\n\n/**\n * API Key is required for server-side operations\n * Set the APPWRITE_API_KEY environment variable or replace this value directly.\n */\nexport const API_KEY = process.env.APPWRITE_API_KEY ?? '';\n{{/if}}\n";
@@ -144010,7 +144032,7 @@ ${supportsServerSide ? ` create: (databaseId: string, name: string, options?: {
144010
144032
  delete (api as any).deleteMany;
144011
144033
  }`;
144012
144034
  }
144013
- generateDatabasesFile(config2) {
144035
+ generateDatabasesFile(config2, importExt) {
144014
144036
  const entities = config2.tables?.length ? config2.tables : config2.collections;
144015
144037
  if (!entities || entities.length === 0) {
144016
144038
  return "// No tables or collections found in configuration\n";
@@ -144024,6 +144046,7 @@ ${supportsServerSide ? ` create: (databaseId: string, name: string, options?: {
144024
144046
  return databasesTemplate({
144025
144047
  appwriteDep,
144026
144048
  supportsServerSide,
144049
+ importExt,
144027
144050
  TABLE_ID_MAP: this.generateTableIdMap(entitiesByDb),
144028
144051
  TABLES_WITH_RELATIONSHIPS: this.generateTablesWithRelationships(entitiesByDb),
144029
144052
  BULK_METHODS: this.generateBulkMethods(supportsServerSide),
@@ -144031,10 +144054,11 @@ ${supportsServerSide ? ` create: (databaseId: string, name: string, options?: {
144031
144054
  BULK_REMOVAL: this.generateBulkRemoval(supportsServerSide)
144032
144055
  });
144033
144056
  }
144034
- generateIndexFile() {
144057
+ generateIndexFile(importExt) {
144035
144058
  return indexTemplate({
144036
144059
  sdkTitle: SDK_TITLE,
144037
- executableName: EXECUTABLE_NAME
144060
+ executableName: EXECUTABLE_NAME,
144061
+ importExt
144038
144062
  });
144039
144063
  }
144040
144064
  generateConstantsFile(config2) {
@@ -144054,6 +144078,7 @@ ${supportsServerSide ? ` create: (databaseId: string, name: string, options?: {
144054
144078
  if (!config2.projectId) {
144055
144079
  throw new Error("Project ID is required in configuration");
144056
144080
  }
144081
+ const importExt = detectImportExtension();
144057
144082
  const files = /* @__PURE__ */ new Map();
144058
144083
  const hasEntities = config2.tables && config2.tables.length > 0 || config2.collections && config2.collections.length > 0;
144059
144084
  if (!hasEntities) {
@@ -144068,13 +144093,13 @@ ${supportsServerSide ? ` create: (databaseId: string, name: string, options?: {
144068
144093
  "types.ts",
144069
144094
  "// No tables or collections found in configuration\n"
144070
144095
  );
144071
- files.set("index.ts", this.generateIndexFile());
144096
+ files.set("index.ts", this.generateIndexFile(importExt));
144072
144097
  files.set("constants.ts", this.generateConstantsFile(config2));
144073
144098
  return { files };
144074
144099
  }
144075
144100
  files.set("types.ts", this.generateTypesFile(config2));
144076
- files.set("databases.ts", this.generateDatabasesFile(config2));
144077
- files.set("index.ts", this.generateIndexFile());
144101
+ files.set("databases.ts", this.generateDatabasesFile(config2, importExt));
144102
+ files.set("index.ts", this.generateIndexFile(importExt));
144078
144103
  files.set("constants.ts", this.generateConstantsFile(config2));
144079
144104
  return { files };
144080
144105
  }
@@ -144193,10 +144218,11 @@ Use --language to specify the target language. Supported: ${supported}`
144193
144218
  const firstEntity = entities?.[0];
144194
144219
  const dbId = firstEntity?.databaseId ?? "databaseId";
144195
144220
  const tableName = firstEntity?.name ?? "tableName";
144221
+ const importExt = detectImportExtension();
144196
144222
  console.log("");
144197
144223
  log(`Import the generated SDK in your project:`);
144198
144224
  console.log(
144199
- ` import { databases } from "./${outputDir}/${SDK_TITLE_LOWER}/index.js";`
144225
+ ` import { databases } from "./${outputDir}/${SDK_TITLE_LOWER}/index${importExt}";`
144200
144226
  );
144201
144227
  console.log("");
144202
144228
  log(`Configure your SDK constants:`);
@@ -144233,7 +144259,7 @@ var generate = new Command("generate").description(
144233
144259
  `
144234
144260
  Example:
144235
144261
  Import the generated SDK in your project:
144236
- import { databases } from "./generated/${SDK_TITLE_LOWER}/index.js";
144262
+ import { databases } from "./generated/${SDK_TITLE_LOWER}/index${detectImportExtension()}";
144237
144263
 
144238
144264
  Configure your SDK constants:
144239
144265
  set values in ./generated/${SDK_TITLE_LOWER}/constants.ts
@@ -147969,9 +147995,6 @@ if (process.argv.includes("-v") || process.argv.includes("--version")) {
147969
147995
  }
147970
147996
  /*! Bundled license information:
147971
147997
 
147972
- safe-buffer/index.js:
147973
- (*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> *)
147974
-
147975
147998
  undici/lib/fetch/body.js:
147976
147999
  (*! formdata-polyfill. MIT License. Jimmy Wärting <https://jimmy.warting.se/opensource> *)
147977
148000
 
package/dist/index.d.ts CHANGED
@@ -8,4 +8,5 @@ import { Pull } from "./lib/commands/pull.js";
8
8
  import { Schema } from "./lib/commands/schema.js";
9
9
  export { Schema, Push, Pull };
10
10
  export type { ConfigType, SettingsType, FunctionType, SiteType, DatabaseType, CollectionType, TableType, TopicType, TeamType, MessageType, BucketType, AttributeType, IndexType, ColumnType, TableIndexType, } from "./lib/commands/config.js";
11
+ export { ConfigSchema, SettingsSchema, SiteSchema, FunctionSchema, DatabaseSchema, CollectionSchema, AttributeSchema, IndexSchema, TableSchema, ColumnSchema, IndexTableSchema, TopicSchema, TeamSchema, MessageSchema, BucketSchema, } from "./lib/commands/config.js";
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC9B,YAAY,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,SAAS,EACT,SAAS,EACT,QAAQ,EACR,WAAW,EACX,UAAU,EACV,aAAa,EACb,SAAS,EACT,UAAU,EACV,cAAc,GACf,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC9B,YAAY,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,SAAS,EACT,SAAS,EACT,QAAQ,EACR,WAAW,EACX,UAAU,EACV,aAAa,EACb,SAAS,EACT,UAAU,EACV,cAAc,GACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,YAAY,EACZ,cAAc,EACd,UAAU,EACV,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,aAAa,EACb,YAAY,GACb,MAAM,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -19605,7 +19605,6 @@ var require_safe_buffer = __commonJS({
19605
19605
  function SafeBuffer(arg, encodingOrOffset, length) {
19606
19606
  return Buffer2(arg, encodingOrOffset, length);
19607
19607
  }
19608
- SafeBuffer.prototype = Object.create(Buffer2.prototype);
19609
19608
  copyProps(Buffer2, SafeBuffer);
19610
19609
  SafeBuffer.from = function(arg, encodingOrOffset, length) {
19611
19610
  if (typeof arg === "number") {
@@ -70688,7 +70687,7 @@ var id_default = ID;
70688
70687
  // lib/constants.ts
70689
70688
  var SDK_TITLE = "Appwrite";
70690
70689
  var SDK_TITLE_LOWER = "appwrite";
70691
- var SDK_VERSION = "13.3.0";
70690
+ var SDK_VERSION = "13.3.2";
70692
70691
  var SDK_LOGO = "\n _ _ _ ___ __ _____\n /_\\ _ __ _ ____ ___ __(_) |_ ___ / __\\ / / \\_ \\\n //_\\\\| '_ \\| '_ \\ \\ /\\ / / '__| | __/ _ \\ / / / / / /\\/\n / _ \\ |_) | |_) \\ V V /| | | | || __/ / /___/ /___/\\/ /_\n \\_/ \\_/ .__/| .__/ \\_/\\_/ |_| |_|\\__\\___| \\____/\\____/\\____/\n |_| |_|\n\n";
70693
70692
  var EXECUTABLE_NAME = "appwrite";
70694
70693
  var NPM_PACKAGE_NAME = "appwrite-cli";
@@ -106401,7 +106400,7 @@ var package_default = {
106401
106400
  type: "module",
106402
106401
  homepage: "https://appwrite.io/support",
106403
106402
  description: "Appwrite is an open-source self-hosted backend server that abstracts and simplifies complex and repetitive development tasks behind a very simple REST API",
106404
- version: "13.3.0",
106403
+ version: "13.3.2",
106405
106404
  license: "BSD-3-Clause",
106406
106405
  main: "dist/index.js",
106407
106406
  types: "dist/index.d.ts",
@@ -106487,14 +106486,21 @@ var drawTable = (data) => {
106487
106486
  console.log("[]");
106488
106487
  return;
106489
106488
  }
106490
- const obj = data.reduce((res, item) => ({ ...res, ...item }), {});
106489
+ const rows = data.map(
106490
+ (item) => item && typeof item === "object" && !Array.isArray(item) ? item : {}
106491
+ );
106492
+ const obj = rows.reduce((res, item) => ({ ...res, ...item }), {});
106491
106493
  const keys = Object.keys(obj);
106494
+ if (keys.length === 0) {
106495
+ drawJSON(data);
106496
+ return;
106497
+ }
106492
106498
  const def = keys.reduce((result, key) => {
106493
106499
  result[key] = "-";
106494
106500
  return result;
106495
106501
  }, {});
106496
- data = data.map((item) => ({ ...def, ...item }));
106497
- const columns = Object.keys(data[0]);
106502
+ const normalizedData = rows.map((item) => ({ ...def, ...item }));
106503
+ const columns = Object.keys(normalizedData[0]);
106498
106504
  const table = new import_cli_table3.default({
106499
106505
  head: columns.map((c) => import_chalk2.default.cyan.italic.bold(c)),
106500
106506
  chars: {
@@ -106515,10 +106521,10 @@ var drawTable = (data) => {
106515
106521
  middle: import_chalk2.default.cyan("\u2502")
106516
106522
  }
106517
106523
  });
106518
- data.forEach((row) => {
106524
+ normalizedData.forEach((row) => {
106519
106525
  const rowValues = [];
106520
- for (const key in row) {
106521
- if (row[key] === null) {
106526
+ for (const key of columns) {
106527
+ if (row[key] == null) {
106522
106528
  rowValues.push("-");
106523
106529
  } else if (Array.isArray(row[key])) {
106524
106530
  rowValues.push(JSON.stringify(row[key]));
@@ -106532,6 +106538,9 @@ var drawTable = (data) => {
106532
106538
  });
106533
106539
  console.log(table.toString());
106534
106540
  };
106541
+ var drawJSON = (data) => {
106542
+ console.log(JSON.stringify(data, null, 2));
106543
+ };
106535
106544
  var parseError = (err) => {
106536
106545
  if (cliConfig.report) {
106537
106546
  (async () => {
@@ -111335,6 +111344,22 @@ function getAppwriteDependency() {
111335
111344
  }
111336
111345
  return "appwrite";
111337
111346
  }
111347
+ function detectImportExtension(cwd = process.cwd()) {
111348
+ try {
111349
+ const pkgPath = path4.resolve(cwd, "package.json");
111350
+ if (fs5.existsSync(pkgPath)) {
111351
+ const pkg = JSON.parse(fs5.readFileSync(pkgPath, "utf-8"));
111352
+ if (pkg.type === "module") {
111353
+ return ".js";
111354
+ }
111355
+ }
111356
+ if (fs5.existsSync(path4.resolve(cwd, "deno.json")) || fs5.existsSync(path4.resolve(cwd, "deno.jsonc"))) {
111357
+ return ".ts";
111358
+ }
111359
+ } catch {
111360
+ }
111361
+ return "";
111362
+ }
111338
111363
  function supportsServerSideMethods(appwriteDep, override = "auto") {
111339
111364
  if (override === "true") return true;
111340
111365
  if (override === "false") return false;
@@ -111455,10 +111480,10 @@ var BaseDatabasesGenerator = class {
111455
111480
  var types_ts_default = "import { type Models } from '{{appwriteDep}}';\n\n{{{ENUMS}}}{{{TYPES}}}\ndeclare const __roleStringBrand: unique symbol;\nexport type RoleString = string & { readonly [__roleStringBrand]: never };\n\nexport type RoleBuilder = {\n any: () => RoleString;\n user: (userId: string, status?: string) => RoleString;\n users: (status?: string) => RoleString;\n guests: () => RoleString;\n team: (teamId: string, role?: string) => RoleString;\n member: (memberId: string) => RoleString;\n label: (label: string) => RoleString;\n}\n\nexport type PermissionBuilder = {\n read: (role: RoleString) => string;\n write: (role: RoleString) => string;\n create: (role: RoleString) => string;\n update: (role: RoleString) => string;\n delete: (role: RoleString) => string;\n}\n\nexport type PermissionCallback = (permission: PermissionBuilder, role: RoleBuilder) => string[];\n\nexport type QueryValue = string | number | boolean;\n\nexport type ExtractQueryValue<T> = T extends (infer U)[]\n ? U extends QueryValue ? U : never\n : T extends QueryValue | null ? NonNullable<T> : never;\n\nexport type QueryableKeys<T> = {\n [K in keyof T]: ExtractQueryValue<T[K]> extends never ? never : K;\n}[keyof T];\n\nexport type QueryBuilder<T> = {\n equal: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n notEqual: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n lessThan: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n lessThanEqual: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n greaterThan: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n greaterThanEqual: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n contains: <K extends QueryableKeys<T>>(field: K, value: ExtractQueryValue<T[K]>) => string;\n search: <K extends QueryableKeys<T>>(field: K, value: string) => string;\n isNull: <K extends QueryableKeys<T>>(field: K) => string;\n isNotNull: <K extends QueryableKeys<T>>(field: K) => string;\n startsWith: <K extends QueryableKeys<T>>(field: K, value: string) => string;\n endsWith: <K extends QueryableKeys<T>>(field: K, value: string) => string;\n between: <K extends QueryableKeys<T>>(field: K, start: ExtractQueryValue<T[K]>, end: ExtractQueryValue<T[K]>) => string;\n select: <K extends keyof T>(fields: K[]) => string;\n orderAsc: <K extends keyof T>(field: K) => string;\n orderDesc: <K extends keyof T>(field: K) => string;\n limit: (value: number) => string;\n offset: (value: number) => string;\n cursorAfter: (documentId: string) => string;\n cursorBefore: (documentId: string) => string;\n or: (...queries: string[]) => string;\n and: (...queries: string[]) => string;\n}\n\nexport type DatabaseId = {{{databaseIdType}}};\n\n{{{DATABASE_TABLES_TYPE}}}\n";
111456
111481
 
111457
111482
  // lib/commands/generators/typescript/templates/databases.ts.hbs
111458
- var databases_ts_default = 'import { Client, TablesDB, ID, Query, type Models, Permission, Role } from \'{{appwriteDep}}\';\nimport type { DatabaseHandle, DatabaseId, DatabaseTableMap, DatabaseTables, QueryBuilder, PermissionBuilder, RoleBuilder, RoleString } from \'./types.js\';\n{{#if supportsServerSide}}\nimport { PROJECT_ID, ENDPOINT, API_KEY } from \'./constants.js\';\n{{else}}\nimport { PROJECT_ID, ENDPOINT } from \'./constants.js\';\n{{/if}}\n\nconst createQueryBuilder = <T>(): QueryBuilder<T> => ({\n equal: (field, value) => Query.equal(String(field), value as any),\n notEqual: (field, value) => Query.notEqual(String(field), value as any),\n lessThan: (field, value) => Query.lessThan(String(field), value as any),\n lessThanEqual: (field, value) => Query.lessThanEqual(String(field), value as any),\n greaterThan: (field, value) => Query.greaterThan(String(field), value as any),\n greaterThanEqual: (field, value) => Query.greaterThanEqual(String(field), value as any),\n contains: (field, value) => Query.contains(String(field), value as any),\n search: (field, value) => Query.search(String(field), value),\n isNull: (field) => Query.isNull(String(field)),\n isNotNull: (field) => Query.isNotNull(String(field)),\n startsWith: (field, value) => Query.startsWith(String(field), value),\n endsWith: (field, value) => Query.endsWith(String(field), value),\n between: (field, start, end) => Query.between(String(field), start as any, end as any),\n select: (fields) => Query.select(fields.map(String)),\n orderAsc: (field) => Query.orderAsc(String(field)),\n orderDesc: (field) => Query.orderDesc(String(field)),\n limit: (value) => Query.limit(value),\n offset: (value) => Query.offset(value),\n cursorAfter: (documentId) => Query.cursorAfter(documentId),\n cursorBefore: (documentId) => Query.cursorBefore(documentId),\n or: (...queries) => Query.or(queries),\n and: (...queries) => Query.and(queries),\n});\n\n{{{TABLE_ID_MAP}}}\n\n{{{TABLES_WITH_RELATIONSHIPS}}}\n\nconst roleBuilder: RoleBuilder = {\n any: () => Role.any() as RoleString,\n user: (userId, status?) => Role.user(userId, status) as RoleString,\n users: (status?) => Role.users(status) as RoleString,\n guests: () => Role.guests() as RoleString,\n team: (teamId, role?) => Role.team(teamId, role) as RoleString,\n member: (memberId) => Role.member(memberId) as RoleString,\n label: (label) => Role.label(label) as RoleString,\n};\n\nconst permissionBuilder: PermissionBuilder = {\n read: (role) => Permission.read(role),\n write: (role) => Permission.write(role),\n create: (role) => Permission.create(role),\n update: (role) => Permission.update(role),\n delete: (role) => Permission.delete(role),\n};\n\nconst resolvePermissions = (callback?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]): string[] | undefined =>\n callback?.(permissionBuilder, roleBuilder);\n\nfunction createTableApi<T extends Models.Row>(\n tablesDB: TablesDB,\n databaseId: string,\n tableId: string,\n) {\n return {\n create: (data: any, options?: { rowId?: string; permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; transactionId?: string }) =>\n tablesDB.createRow<T>({\n databaseId,\n tableId,\n rowId: options?.rowId ?? ID.unique(),\n data,\n permissions: resolvePermissions(options?.permissions),\n transactionId: options?.transactionId,\n }),\n get: (id: string) =>\n tablesDB.getRow<T>({\n databaseId,\n tableId,\n rowId: id,\n }),\n update: (id: string, data: any, options?: { permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; transactionId?: string }) =>\n tablesDB.updateRow<T>({\n databaseId,\n tableId,\n rowId: id,\n data,\n ...(options?.permissions ? { permissions: resolvePermissions(options.permissions) } : {}),\n transactionId: options?.transactionId,\n }),\n delete: async (id: string, options?: { transactionId?: string }) => {\n await tablesDB.deleteRow({\n databaseId,\n tableId,\n rowId: id,\n transactionId: options?.transactionId,\n });\n },\n list: (options?: { queries?: (q: any) => string[] }) =>\n tablesDB.listRows<T>({\n databaseId,\n tableId,\n queries: options?.queries?.(createQueryBuilder<T>()),\n }),{{{BULK_METHODS}}}\n };\n}\n\n{{{BULK_CHECK}}}\nconst hasOwn = (obj: unknown, key: string): boolean =>\n obj != null && Object.prototype.hasOwnProperty.call(obj, key);\n\nfunction createDatabaseHandle<D extends DatabaseId>(\n tablesDB: TablesDB,\n databaseId: D,\n): DatabaseHandle<D> {\n const tableApiCache = new Map<string, unknown>();\n const dbMap = tableIdMap[databaseId];\n\n return {\n use: <T extends keyof DatabaseTableMap[D] & string>(tableId: T): DatabaseTableMap[D][T] => {\n if (!hasOwn(dbMap, tableId)) {\n throw new Error(`Unknown table "${tableId}" in database "${databaseId}"`);\n }\n\n if (!tableApiCache.has(tableId)) {\n const resolvedTableId = dbMap[tableId];\n const api = createTableApi(tablesDB, databaseId, resolvedTableId);\n {{{BULK_REMOVAL}}}\n tableApiCache.set(tableId, api);\n }\n return tableApiCache.get(tableId) as DatabaseTableMap[D][T];\n },\n{{#if supportsServerSide}}\n create: (tableId: string, name: string, options?: { permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; rowSecurity?: boolean; enabled?: boolean; columns?: any[]; indexes?: any[] }) =>\n tablesDB.createTable({\n databaseId,\n tableId,\n name,\n permissions: resolvePermissions(options?.permissions),\n rowSecurity: options?.rowSecurity,\n enabled: options?.enabled,\n columns: options?.columns,\n indexes: options?.indexes,\n }),\n update: (tableId: string, options?: { name?: string; permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; rowSecurity?: boolean; enabled?: boolean }) => {\n if (!hasOwn(dbMap, tableId)) {\n throw new Error(`Unknown table "${tableId}" in database "${databaseId}"`);\n }\n const resolvedTableId = dbMap[tableId];\n return tablesDB.updateTable({\n databaseId,\n tableId: resolvedTableId,\n name: options?.name ?? tableId, // TODO: remove this fallback once fixed in other SDKs\n permissions: resolvePermissions(options?.permissions),\n rowSecurity: options?.rowSecurity,\n enabled: options?.enabled,\n });\n },\n delete: async (tableId: string) => {\n if (!hasOwn(dbMap, tableId)) {\n throw new Error(`Unknown table "${tableId}" in database "${databaseId}"`);\n }\n const resolvedTableId = dbMap[tableId];\n await tablesDB.deleteTable({\n databaseId,\n tableId: resolvedTableId,\n });\n },\n{{/if}}\n };\n}\n\nfunction createDatabasesApi(tablesDB: TablesDB): DatabaseTables {\n const dbCache = new Map<DatabaseId, ReturnType<typeof createDatabaseHandle>>();\n\n return {\n use: (databaseId: DatabaseId) => {\n if (!hasOwn(tableIdMap, databaseId)) {\n throw new Error(`Unknown database "${databaseId}"`);\n }\n\n if (!dbCache.has(databaseId)) {\n dbCache.set(databaseId, createDatabaseHandle(tablesDB, databaseId));\n }\n return dbCache.get(databaseId);\n },\n{{#if supportsServerSide}}\n create: (databaseId: string, name: string, options?: { enabled?: boolean }) =>\n tablesDB.create({\n databaseId,\n name,\n enabled: options?.enabled,\n }),\n update: (databaseId: DatabaseId, options?: { name?: string; enabled?: boolean }) => {\n return tablesDB.update({\n databaseId,\n name: options?.name ?? databaseId,\n enabled: options?.enabled,\n });\n },\n delete: async (databaseId: DatabaseId) => {\n await tablesDB.delete({\n databaseId,\n });\n },\n{{/if}}\n } as DatabaseTables;\n}\n\n// Initialize client\nconst client = new Client()\n .setEndpoint(ENDPOINT)\n .setProject(PROJECT_ID){{#if supportsServerSide}}\n .setKey(API_KEY){{/if}};\n\nconst tablesDB = new TablesDB(client);\n\nexport const databases: DatabaseTables = createDatabasesApi(tablesDB);\n';
111483
+ var databases_ts_default = 'import { Client, TablesDB, ID, Query, type Models, Permission, Role } from \'{{appwriteDep}}\';\nimport type { DatabaseHandle, DatabaseId, DatabaseTableMap, DatabaseTables, QueryBuilder, PermissionBuilder, RoleBuilder, RoleString } from \'./types{{importExt}}\';\n{{#if supportsServerSide}}\nimport { PROJECT_ID, ENDPOINT, API_KEY } from \'./constants{{importExt}}\';\n{{else}}\nimport { PROJECT_ID, ENDPOINT } from \'./constants{{importExt}}\';\n{{/if}}\n\nconst createQueryBuilder = <T>(): QueryBuilder<T> => ({\n equal: (field, value) => Query.equal(String(field), value as any),\n notEqual: (field, value) => Query.notEqual(String(field), value as any),\n lessThan: (field, value) => Query.lessThan(String(field), value as any),\n lessThanEqual: (field, value) => Query.lessThanEqual(String(field), value as any),\n greaterThan: (field, value) => Query.greaterThan(String(field), value as any),\n greaterThanEqual: (field, value) => Query.greaterThanEqual(String(field), value as any),\n contains: (field, value) => Query.contains(String(field), value as any),\n search: (field, value) => Query.search(String(field), value),\n isNull: (field) => Query.isNull(String(field)),\n isNotNull: (field) => Query.isNotNull(String(field)),\n startsWith: (field, value) => Query.startsWith(String(field), value),\n endsWith: (field, value) => Query.endsWith(String(field), value),\n between: (field, start, end) => Query.between(String(field), start as any, end as any),\n select: (fields) => Query.select(fields.map(String)),\n orderAsc: (field) => Query.orderAsc(String(field)),\n orderDesc: (field) => Query.orderDesc(String(field)),\n limit: (value) => Query.limit(value),\n offset: (value) => Query.offset(value),\n cursorAfter: (documentId) => Query.cursorAfter(documentId),\n cursorBefore: (documentId) => Query.cursorBefore(documentId),\n or: (...queries) => Query.or(queries),\n and: (...queries) => Query.and(queries),\n});\n\n{{{TABLE_ID_MAP}}}\n\n{{{TABLES_WITH_RELATIONSHIPS}}}\n\nconst roleBuilder: RoleBuilder = {\n any: () => Role.any() as RoleString,\n user: (userId, status?) => Role.user(userId, status) as RoleString,\n users: (status?) => Role.users(status) as RoleString,\n guests: () => Role.guests() as RoleString,\n team: (teamId, role?) => Role.team(teamId, role) as RoleString,\n member: (memberId) => Role.member(memberId) as RoleString,\n label: (label) => Role.label(label) as RoleString,\n};\n\nconst permissionBuilder: PermissionBuilder = {\n read: (role) => Permission.read(role),\n write: (role) => Permission.write(role),\n create: (role) => Permission.create(role),\n update: (role) => Permission.update(role),\n delete: (role) => Permission.delete(role),\n};\n\nconst resolvePermissions = (callback?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]): string[] | undefined =>\n callback?.(permissionBuilder, roleBuilder);\n\nfunction createTableApi<T extends Models.Row>(\n tablesDB: TablesDB,\n databaseId: string,\n tableId: string,\n) {\n return {\n create: (data: any, options?: { rowId?: string; permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; transactionId?: string }) =>\n tablesDB.createRow<T>({\n databaseId,\n tableId,\n rowId: options?.rowId ?? ID.unique(),\n data,\n permissions: resolvePermissions(options?.permissions),\n transactionId: options?.transactionId,\n }),\n get: (id: string) =>\n tablesDB.getRow<T>({\n databaseId,\n tableId,\n rowId: id,\n }),\n update: (id: string, data: any, options?: { permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; transactionId?: string }) =>\n tablesDB.updateRow<T>({\n databaseId,\n tableId,\n rowId: id,\n data,\n ...(options?.permissions ? { permissions: resolvePermissions(options.permissions) } : {}),\n transactionId: options?.transactionId,\n }),\n delete: async (id: string, options?: { transactionId?: string }) => {\n await tablesDB.deleteRow({\n databaseId,\n tableId,\n rowId: id,\n transactionId: options?.transactionId,\n });\n },\n list: (options?: { queries?: (q: any) => string[] }) =>\n tablesDB.listRows<T>({\n databaseId,\n tableId,\n queries: options?.queries?.(createQueryBuilder<T>()),\n }),{{{BULK_METHODS}}}\n };\n}\n\n{{{BULK_CHECK}}}\nconst hasOwn = (obj: unknown, key: string): boolean =>\n obj != null && Object.prototype.hasOwnProperty.call(obj, key);\n\nfunction createDatabaseHandle<D extends DatabaseId>(\n tablesDB: TablesDB,\n databaseId: D,\n): DatabaseHandle<D> {\n const tableApiCache = new Map<string, unknown>();\n const dbMap = tableIdMap[databaseId];\n\n return {\n use: <T extends keyof DatabaseTableMap[D] & string>(tableId: T): DatabaseTableMap[D][T] => {\n if (!hasOwn(dbMap, tableId)) {\n throw new Error(`Unknown table "${tableId}" in database "${databaseId}"`);\n }\n\n if (!tableApiCache.has(tableId)) {\n const resolvedTableId = dbMap[tableId];\n const api = createTableApi(tablesDB, databaseId, resolvedTableId);\n {{{BULK_REMOVAL}}}\n tableApiCache.set(tableId, api);\n }\n return tableApiCache.get(tableId) as DatabaseTableMap[D][T];\n },\n{{#if supportsServerSide}}\n create: (tableId: string, name: string, options?: { permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; rowSecurity?: boolean; enabled?: boolean; columns?: any[]; indexes?: any[] }) =>\n tablesDB.createTable({\n databaseId,\n tableId,\n name,\n permissions: resolvePermissions(options?.permissions),\n rowSecurity: options?.rowSecurity,\n enabled: options?.enabled,\n columns: options?.columns,\n indexes: options?.indexes,\n }),\n update: (tableId: string, options?: { name?: string; permissions?: (permission: { read: (role: RoleString) => string; write: (role: RoleString) => string; create: (role: RoleString) => string; update: (role: RoleString) => string; delete: (role: RoleString) => string }, role: { any: () => RoleString; user: (userId: string, status?: string) => RoleString; users: (status?: string) => RoleString; guests: () => RoleString; team: (teamId: string, role?: string) => RoleString; member: (memberId: string) => RoleString; label: (label: string) => RoleString }) => string[]; rowSecurity?: boolean; enabled?: boolean }) => {\n if (!hasOwn(dbMap, tableId)) {\n throw new Error(`Unknown table "${tableId}" in database "${databaseId}"`);\n }\n const resolvedTableId = dbMap[tableId];\n return tablesDB.updateTable({\n databaseId,\n tableId: resolvedTableId,\n name: options?.name ?? tableId, // TODO: remove this fallback once fixed in other SDKs\n permissions: resolvePermissions(options?.permissions),\n rowSecurity: options?.rowSecurity,\n enabled: options?.enabled,\n });\n },\n delete: async (tableId: string) => {\n if (!hasOwn(dbMap, tableId)) {\n throw new Error(`Unknown table "${tableId}" in database "${databaseId}"`);\n }\n const resolvedTableId = dbMap[tableId];\n await tablesDB.deleteTable({\n databaseId,\n tableId: resolvedTableId,\n });\n },\n{{/if}}\n };\n}\n\nfunction createDatabasesApi(tablesDB: TablesDB): DatabaseTables {\n const dbCache = new Map<DatabaseId, ReturnType<typeof createDatabaseHandle>>();\n\n return {\n use: (databaseId: DatabaseId) => {\n if (!hasOwn(tableIdMap, databaseId)) {\n throw new Error(`Unknown database "${databaseId}"`);\n }\n\n if (!dbCache.has(databaseId)) {\n dbCache.set(databaseId, createDatabaseHandle(tablesDB, databaseId));\n }\n return dbCache.get(databaseId);\n },\n{{#if supportsServerSide}}\n create: (databaseId: string, name: string, options?: { enabled?: boolean }) =>\n tablesDB.create({\n databaseId,\n name,\n enabled: options?.enabled,\n }),\n update: (databaseId: DatabaseId, options?: { name?: string; enabled?: boolean }) => {\n return tablesDB.update({\n databaseId,\n name: options?.name ?? databaseId,\n enabled: options?.enabled,\n });\n },\n delete: async (databaseId: DatabaseId) => {\n await tablesDB.delete({\n databaseId,\n });\n },\n{{/if}}\n } as DatabaseTables;\n}\n\n// Initialize client\nconst client = new Client()\n .setEndpoint(ENDPOINT)\n .setProject(PROJECT_ID){{#if supportsServerSide}}\n .setKey(API_KEY){{/if}};\n\nconst tablesDB = new TablesDB(client);\n\nexport const databases: DatabaseTables = createDatabasesApi(tablesDB);\n';
111459
111484
 
111460
111485
  // lib/commands/generators/typescript/templates/index.ts.hbs
111461
- var index_ts_default = '/**\n * {{sdkTitle}} Generated SDK\n *\n * This file is auto-generated. Do not edit manually.\n * Re-run `{{executableName}} generate` to regenerate.\n */\n\nexport { databases } from "./databases.js";\nexport * from "./types.js";\n';
111486
+ var index_ts_default = '/**\n * {{sdkTitle}} Generated SDK\n *\n * This file is auto-generated. Do not edit manually.\n * Re-run `{{executableName}} generate` to regenerate.\n */\n\nexport { databases } from "./databases{{importExt}}";\nexport * from "./types{{importExt}}";\n';
111462
111487
 
111463
111488
  // lib/commands/generators/typescript/templates/constants.ts.hbs
111464
111489
  var constants_ts_default = "/**\n * {{sdkTitle}} Configuration Constants\n *\n * This file contains configuration for the generated SDK.\n * You may modify these values as needed.\n */\n\nexport const PROJECT_ID = '{{projectId}}';\nexport const ENDPOINT = '{{endpoint}}';\n{{#if requiresApiKey}}\n\n/**\n * API Key is required for server-side operations\n * Set the APPWRITE_API_KEY environment variable or replace this value directly.\n */\nexport const API_KEY = process.env.APPWRITE_API_KEY ?? '';\n{{/if}}\n";
@@ -111727,7 +111752,7 @@ ${supportsServerSide ? ` create: (databaseId: string, name: string, options?: {
111727
111752
  delete (api as any).deleteMany;
111728
111753
  }`;
111729
111754
  }
111730
- generateDatabasesFile(config2) {
111755
+ generateDatabasesFile(config2, importExt) {
111731
111756
  const entities = config2.tables?.length ? config2.tables : config2.collections;
111732
111757
  if (!entities || entities.length === 0) {
111733
111758
  return "// No tables or collections found in configuration\n";
@@ -111741,6 +111766,7 @@ ${supportsServerSide ? ` create: (databaseId: string, name: string, options?: {
111741
111766
  return databasesTemplate({
111742
111767
  appwriteDep,
111743
111768
  supportsServerSide,
111769
+ importExt,
111744
111770
  TABLE_ID_MAP: this.generateTableIdMap(entitiesByDb),
111745
111771
  TABLES_WITH_RELATIONSHIPS: this.generateTablesWithRelationships(entitiesByDb),
111746
111772
  BULK_METHODS: this.generateBulkMethods(supportsServerSide),
@@ -111748,10 +111774,11 @@ ${supportsServerSide ? ` create: (databaseId: string, name: string, options?: {
111748
111774
  BULK_REMOVAL: this.generateBulkRemoval(supportsServerSide)
111749
111775
  });
111750
111776
  }
111751
- generateIndexFile() {
111777
+ generateIndexFile(importExt) {
111752
111778
  return indexTemplate({
111753
111779
  sdkTitle: SDK_TITLE,
111754
- executableName: EXECUTABLE_NAME
111780
+ executableName: EXECUTABLE_NAME,
111781
+ importExt
111755
111782
  });
111756
111783
  }
111757
111784
  generateConstantsFile(config2) {
@@ -111771,6 +111798,7 @@ ${supportsServerSide ? ` create: (databaseId: string, name: string, options?: {
111771
111798
  if (!config2.projectId) {
111772
111799
  throw new Error("Project ID is required in configuration");
111773
111800
  }
111801
+ const importExt = detectImportExtension();
111774
111802
  const files = /* @__PURE__ */ new Map();
111775
111803
  const hasEntities = config2.tables && config2.tables.length > 0 || config2.collections && config2.collections.length > 0;
111776
111804
  if (!hasEntities) {
@@ -111785,13 +111813,13 @@ ${supportsServerSide ? ` create: (databaseId: string, name: string, options?: {
111785
111813
  "types.ts",
111786
111814
  "// No tables or collections found in configuration\n"
111787
111815
  );
111788
- files.set("index.ts", this.generateIndexFile());
111816
+ files.set("index.ts", this.generateIndexFile(importExt));
111789
111817
  files.set("constants.ts", this.generateConstantsFile(config2));
111790
111818
  return { files };
111791
111819
  }
111792
111820
  files.set("types.ts", this.generateTypesFile(config2));
111793
- files.set("databases.ts", this.generateDatabasesFile(config2));
111794
- files.set("index.ts", this.generateIndexFile());
111821
+ files.set("databases.ts", this.generateDatabasesFile(config2, importExt));
111822
+ files.set("index.ts", this.generateIndexFile(importExt));
111795
111823
  files.set("constants.ts", this.generateConstantsFile(config2));
111796
111824
  return { files };
111797
111825
  }
@@ -111887,15 +111915,27 @@ var Schema = class {
111887
111915
  }
111888
111916
  };
111889
111917
  export {
111918
+ AttributeSchema,
111919
+ BucketSchema,
111920
+ CollectionSchema,
111921
+ ColumnSchema,
111922
+ ConfigSchema,
111923
+ DatabaseSchema,
111924
+ FunctionSchema,
111925
+ IndexSchema,
111926
+ IndexTableSchema,
111927
+ MessageSchema,
111890
111928
  Pull,
111891
111929
  Push,
111892
- Schema
111930
+ Schema,
111931
+ SettingsSchema,
111932
+ SiteSchema,
111933
+ TableSchema,
111934
+ TeamSchema,
111935
+ TopicSchema
111893
111936
  };
111894
111937
  /*! Bundled license information:
111895
111938
 
111896
- safe-buffer/index.js:
111897
- (*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> *)
111898
-
111899
111939
  undici/lib/fetch/body.js:
111900
111940
  (*! formdata-polyfill. MIT License. Jimmy Wärting <https://jimmy.warting.se/opensource> *)
111901
111941
 
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../lib/commands/generate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBpC,KAAK,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAiID,eAAO,MAAM,QAAQ,SAgCkB,CAAC"}
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../lib/commands/generate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,KAAK,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAkID,eAAO,MAAM,QAAQ,SAgCkB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"databases.d.ts","sourceRoot":"","sources":["../../../../../lib/commands/generators/typescript/databases.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAmB,MAAM,iBAAiB,CAAC;AAI9D,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAgCpB;;;GAGG;AACH,qBAAa,4BAA6B,SAAQ,sBAAsB;IACtE,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAgB;IACpD,QAAQ,CAAC,aAAa,QAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IACzC,OAAO,CAAC,kBAAkB,CAAqC;IAE/D,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI;IAIhE,OAAO,CAAC,SAAS;IAQjB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAM9B,OAAO,CAAC,iBAAiB;IAwCzB,OAAO,CAAC,eAAe;IA6BvB,OAAO,CAAC,aAAa;IA4BrB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,0BAA0B;IA6ElC,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,+BAA+B;IAsBvC,OAAO,CAAC,mBAAmB;IA4B3B,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,qBAAqB;IA0B7B,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,qBAAqB;IAevB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC;CAmC5D"}
1
+ {"version":3,"file":"databases.d.ts","sourceRoot":"","sources":["../../../../../lib/commands/generators/typescript/databases.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAmB,MAAM,iBAAiB,CAAC;AAI9D,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAiCpB;;;GAGG;AACH,qBAAa,4BAA6B,SAAQ,sBAAsB;IACtE,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAgB;IACpD,QAAQ,CAAC,aAAa,QAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IACzC,OAAO,CAAC,kBAAkB,CAAqC;IAE/D,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI;IAIhE,OAAO,CAAC,SAAS;IAQjB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAM9B,OAAO,CAAC,iBAAiB;IAwCzB,OAAO,CAAC,eAAe;IA6BvB,OAAO,CAAC,aAAa;IA4BrB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,0BAA0B;IA6ElC,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,+BAA+B;IAsBvC,OAAO,CAAC,mBAAmB;IA4B3B,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,qBAAqB;IA2B7B,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,qBAAqB;IAevB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC;CAoC5D"}
@@ -1,6 +1,6 @@
1
1
  export declare const SDK_TITLE = "Appwrite";
2
2
  export declare const SDK_TITLE_LOWER = "appwrite";
3
- export declare const SDK_VERSION = "13.3.0";
3
+ export declare const SDK_VERSION = "13.3.2";
4
4
  export declare const SDK_NAME = "Command Line";
5
5
  export declare const SDK_PLATFORM = "console";
6
6
  export declare const SDK_LANGUAGE = "cli";
@@ -1,7 +1,7 @@
1
1
  import type { CliConfig } from "./types.js";
2
2
  declare const cliConfig: CliConfig;
3
3
  export declare const parse: (data: Record<string, any>) => void;
4
- export declare const drawTable: (data: Array<Record<string, any>>) => void;
4
+ export declare const drawTable: (data: Array<Record<string, any> | null | undefined>) => void;
5
5
  export declare const drawJSON: (data: any) => void;
6
6
  export declare const parseError: (err: Error) => void;
7
7
  export declare const actionRunner: <T extends (...args: any[]) => Promise<any>>(fn: T) => ((...args: Parameters<T>) => Promise<void>);
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../lib/parser.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAQ5C,QAAA,MAAM,SAAS,EAAE,SAQhB,CAAC;AAEF,eAAO,MAAM,KAAK,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAG,IA2BjD,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAG,IAyD5D,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,MAAM,GAAG,KAAG,IAEpC,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,KAAK,KAAK,KAAG,IA2DvC,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EACrE,IAAI,CAAC,KACJ,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAY5C,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,MAM5C,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,KAAG,OAIzC,CAAC;AAEF,eAAO,MAAM,GAAG,GAAI,UAAU,MAAM,KAAG,IAEtC,CAAC;AAEF,eAAO,MAAM,IAAI,GAAI,UAAU,MAAM,KAAG,IAIvC,CAAC;AAEF,eAAO,MAAM,IAAI,GAAI,UAAU,MAAM,KAAG,IAEvC,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,UAAU,MAAM,KAAG,IAI1C,CAAC;AAEF,eAAO,MAAM,KAAK,GAAI,UAAU,MAAM,KAAG,IAExC,CAAC;AAEF,eAAO,MAAM,IAAI,wXAAW,CAAC;AAE7B,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA+BtD,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../lib/parser.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAQ5C,QAAA,MAAM,SAAS,EAAE,SAQhB,CAAC;AAEF,eAAO,MAAM,KAAK,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAG,IA2BjD,CAAC;AAEF,eAAO,MAAM,SAAS,GACpB,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,KAClD,IAiEF,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,MAAM,GAAG,KAAG,IAEpC,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,KAAK,KAAK,KAAG,IA2DvC,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EACrE,IAAI,CAAC,KACJ,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAY5C,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,MAM5C,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,KAAG,OAIzC,CAAC;AAEF,eAAO,MAAM,GAAG,GAAI,UAAU,MAAM,KAAG,IAEtC,CAAC;AAEF,eAAO,MAAM,IAAI,GAAI,UAAU,MAAM,KAAG,IAIvC,CAAC;AAEF,eAAO,MAAM,IAAI,GAAI,UAAU,MAAM,KAAG,IAEvC,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,UAAU,MAAM,KAAG,IAI1C,CAAC;AAEF,eAAO,MAAM,KAAK,GAAI,UAAU,MAAM,KAAG,IAExC,CAAC;AAEF,eAAO,MAAM,IAAI,wXAAW,CAAC;AAE7B,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA+BtD,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -23,6 +23,11 @@ export declare function getTypeScriptType(attribute: TypeAttribute, entities: Ty
23
23
  * @returns The appropriate Appwrite import path
24
24
  */
25
25
  export declare function getAppwriteDependency(): string;
26
+ /**
27
+ * Detects whether the user's project uses native ESM.
28
+ * Returns ".js" for ESM projects (package.json "type": "module" or Deno), "" for non-ESM projects.
29
+ */
30
+ export declare function detectImportExtension(cwd?: string): string;
26
31
  /**
27
32
  * Checks if the Appwrite dependency supports server-side methods.
28
33
  *
@@ -1 +1 @@
1
- {"version":3,"file":"typescript-type-utils.d.ts","sourceRoot":"","sources":["../../../lib/shared/typescript-type-utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EACV,cAAc,EACd,SAAS,EACV,MAAM,uBAAuB,CAAC;AAE/B;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,UAAU,CAAC;AAEvD;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,GAAG,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;AAE1E;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,aAAa,EACxB,QAAQ,EAAE,UAAU,EAAE,EACtB,UAAU,EAAE,MAAM,EAClB,SAAS,GAAE,OAAe,GACzB,MAAM,CA0ER;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAkC9C;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE,MAAM,GAAG,MAAM,GAAG,OAAgB,GAC3C,OAAO,CAQT"}
1
+ {"version":3,"file":"typescript-type-utils.d.ts","sourceRoot":"","sources":["../../../lib/shared/typescript-type-utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EACV,cAAc,EACd,SAAS,EACV,MAAM,uBAAuB,CAAC;AAE/B;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,UAAU,CAAC;AAEvD;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,GAAG,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;AAE1E;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,aAAa,EACxB,QAAQ,EAAE,UAAU,EAAE,EACtB,UAAU,EAAE,MAAM,EAClB,SAAS,GAAE,OAAe,GACzB,MAAM,CA0ER;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAkC9C;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAoBzE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE,MAAM,GAAG,MAAM,GAAG,OAAgB,GAC3C,OAAO,CAQT"}
package/index.ts CHANGED
@@ -26,3 +26,20 @@ export type {
26
26
  ColumnType,
27
27
  TableIndexType,
28
28
  } from "./lib/commands/config.js";
29
+ export {
30
+ ConfigSchema,
31
+ SettingsSchema,
32
+ SiteSchema,
33
+ FunctionSchema,
34
+ DatabaseSchema,
35
+ CollectionSchema,
36
+ AttributeSchema,
37
+ IndexSchema,
38
+ TableSchema,
39
+ ColumnSchema,
40
+ IndexTableSchema,
41
+ TopicSchema,
42
+ TeamSchema,
43
+ MessageSchema,
44
+ BucketSchema,
45
+ } from "./lib/commands/config.js";
package/install.ps1 CHANGED
@@ -13,8 +13,8 @@
13
13
  # You can use "View source" of this page to see the full script.
14
14
 
15
15
  # REPO
16
- $GITHUB_x64_URL = "https://github.com/appwrite/sdk-for-cli/releases/download/13.3.0/appwrite-cli-win-x64.exe"
17
- $GITHUB_arm64_URL = "https://github.com/appwrite/sdk-for-cli/releases/download/13.3.0/appwrite-cli-win-arm64.exe"
16
+ $GITHUB_x64_URL = "https://github.com/appwrite/sdk-for-cli/releases/download/13.3.2/appwrite-cli-win-x64.exe"
17
+ $GITHUB_arm64_URL = "https://github.com/appwrite/sdk-for-cli/releases/download/13.3.2/appwrite-cli-win-arm64.exe"
18
18
 
19
19
  $APPWRITE_BINARY_NAME = "appwrite.exe"
20
20
 
package/install.sh CHANGED
@@ -96,7 +96,7 @@ printSuccess() {
96
96
  downloadBinary() {
97
97
  echo "[2/4] Downloading executable for $OS ($ARCH) ..."
98
98
 
99
- GITHUB_LATEST_VERSION="13.3.0"
99
+ GITHUB_LATEST_VERSION="13.3.2"
100
100
  GITHUB_FILE="appwrite-cli-${OS}-${ARCH}"
101
101
  GITHUB_URL="https://github.com/$GITHUB_REPOSITORY_NAME/releases/download/$GITHUB_LATEST_VERSION/$GITHUB_FILE"
102
102
 
@@ -17,6 +17,7 @@ import {
17
17
  EXECUTABLE_NAME,
18
18
  DEFAULT_ENDPOINT,
19
19
  } from "../constants.js";
20
+ import { detectImportExtension } from "../shared/typescript-type-utils.js";
20
21
 
21
22
  type ServerSideOverride = "auto" | "true" | "false";
22
23
 
@@ -129,11 +130,12 @@ const generateAction = async (
129
130
  const firstEntity = entities?.[0];
130
131
  const dbId = firstEntity?.databaseId ?? "databaseId";
131
132
  const tableName = firstEntity?.name ?? "tableName";
133
+ const importExt = detectImportExtension();
132
134
 
133
135
  console.log("");
134
136
  log(`Import the generated SDK in your project:`);
135
137
  console.log(
136
- ` import { databases } from "./${outputDir}/${SDK_TITLE_LOWER}/index.js";`,
138
+ ` import { databases } from "./${outputDir}/${SDK_TITLE_LOWER}/index${importExt}";`,
137
139
  );
138
140
  console.log("");
139
141
  log(`Configure your SDK constants:`);
@@ -176,7 +178,7 @@ export const generate = new Command("generate")
176
178
  `
177
179
  Example:
178
180
  Import the generated SDK in your project:
179
- import { databases } from "./generated/${SDK_TITLE_LOWER}/index.js";
181
+ import { databases } from "./generated/${SDK_TITLE_LOWER}/index${detectImportExtension()}";
180
182
 
181
183
  Configure your SDK constants:
182
184
  set values in ./generated/${SDK_TITLE_LOWER}/constants.ts
@@ -13,6 +13,7 @@ import {
13
13
  getTypeScriptType,
14
14
  getAppwriteDependency,
15
15
  supportsServerSideMethods,
16
+ detectImportExtension,
16
17
  TypeAttribute,
17
18
  TypeEntity,
18
19
  } from "../../../shared/typescript-type-utils.js";
@@ -369,7 +370,7 @@ ${
369
370
  }`;
370
371
  }
371
372
 
372
- private generateDatabasesFile(config: ConfigType): string {
373
+ private generateDatabasesFile(config: ConfigType, importExt: string): string {
373
374
  const entities = config.tables?.length ? config.tables : config.collections;
374
375
 
375
376
  if (!entities || entities.length === 0) {
@@ -386,6 +387,7 @@ ${
386
387
  return databasesTemplate({
387
388
  appwriteDep,
388
389
  supportsServerSide,
390
+ importExt,
389
391
  TABLE_ID_MAP: this.generateTableIdMap(entitiesByDb),
390
392
  TABLES_WITH_RELATIONSHIPS:
391
393
  this.generateTablesWithRelationships(entitiesByDb),
@@ -395,10 +397,11 @@ ${
395
397
  });
396
398
  }
397
399
 
398
- private generateIndexFile(): string {
400
+ private generateIndexFile(importExt: string): string {
399
401
  return indexTemplate({
400
402
  sdkTitle: SDK_TITLE,
401
403
  executableName: EXECUTABLE_NAME,
404
+ importExt,
402
405
  });
403
406
  }
404
407
 
@@ -422,6 +425,7 @@ ${
422
425
  throw new Error("Project ID is required in configuration");
423
426
  }
424
427
 
428
+ const importExt = detectImportExtension();
425
429
  const files = new Map<string, string>();
426
430
 
427
431
  const hasEntities =
@@ -440,14 +444,14 @@ ${
440
444
  "types.ts",
441
445
  "// No tables or collections found in configuration\n",
442
446
  );
443
- files.set("index.ts", this.generateIndexFile());
447
+ files.set("index.ts", this.generateIndexFile(importExt));
444
448
  files.set("constants.ts", this.generateConstantsFile(config));
445
449
  return { files };
446
450
  }
447
451
 
448
452
  files.set("types.ts", this.generateTypesFile(config));
449
- files.set("databases.ts", this.generateDatabasesFile(config));
450
- files.set("index.ts", this.generateIndexFile());
453
+ files.set("databases.ts", this.generateDatabasesFile(config, importExt));
454
+ files.set("index.ts", this.generateIndexFile(importExt));
451
455
  files.set("constants.ts", this.generateConstantsFile(config));
452
456
 
453
457
  return { files };
@@ -1,9 +1,9 @@
1
1
  import { Client, TablesDB, ID, Query, type Models, Permission, Role } from '{{appwriteDep}}';
2
- import type { DatabaseHandle, DatabaseId, DatabaseTableMap, DatabaseTables, QueryBuilder, PermissionBuilder, RoleBuilder, RoleString } from './types.js';
2
+ import type { DatabaseHandle, DatabaseId, DatabaseTableMap, DatabaseTables, QueryBuilder, PermissionBuilder, RoleBuilder, RoleString } from './types{{importExt}}';
3
3
  {{#if supportsServerSide}}
4
- import { PROJECT_ID, ENDPOINT, API_KEY } from './constants.js';
4
+ import { PROJECT_ID, ENDPOINT, API_KEY } from './constants{{importExt}}';
5
5
  {{else}}
6
- import { PROJECT_ID, ENDPOINT } from './constants.js';
6
+ import { PROJECT_ID, ENDPOINT } from './constants{{importExt}}';
7
7
  {{/if}}
8
8
 
9
9
  const createQueryBuilder = <T>(): QueryBuilder<T> => ({
@@ -5,5 +5,5 @@
5
5
  * Re-run `{{executableName}} generate` to regenerate.
6
6
  */
7
7
 
8
- export { databases } from "./databases.js";
9
- export * from "./types.js";
8
+ export { databases } from "./databases{{importExt}}";
9
+ export * from "./types{{importExt}}";
package/lib/constants.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  // SDK
2
2
  export const SDK_TITLE = 'Appwrite';
3
3
  export const SDK_TITLE_LOWER = 'appwrite';
4
- export const SDK_VERSION = '13.3.0';
4
+ export const SDK_VERSION = '13.3.2';
5
5
  export const SDK_NAME = 'Command Line';
6
6
  export const SDK_PLATFORM = 'console';
7
7
  export const SDK_LANGUAGE = 'cli';
package/lib/parser.ts CHANGED
@@ -54,25 +54,35 @@ export const parse = (data: Record<string, any>): void => {
54
54
  }
55
55
  };
56
56
 
57
- export const drawTable = (data: Array<Record<string, any>>): void => {
57
+ export const drawTable = (
58
+ data: Array<Record<string, any> | null | undefined>,
59
+ ): void => {
58
60
  if (data.length == 0) {
59
61
  console.log("[]");
60
62
  return;
61
63
  }
62
64
 
65
+ const rows = data.map((item) =>
66
+ item && typeof item === "object" && !Array.isArray(item) ? item : {},
67
+ );
68
+
63
69
  // Create an object with all the keys in it
64
- const obj = data.reduce((res, item) => ({ ...res, ...item }), {});
70
+ const obj = rows.reduce((res, item) => ({ ...res, ...item }), {});
65
71
  // Get those keys as an array
66
72
  const keys = Object.keys(obj);
73
+ if (keys.length === 0) {
74
+ drawJSON(data);
75
+ return;
76
+ }
67
77
  // Create an object with all keys set to the default value ''
68
78
  const def = keys.reduce((result: Record<string, string>, key) => {
69
79
  result[key] = "-";
70
80
  return result;
71
81
  }, {});
72
82
  // Use object destructuring to replace all default values with the ones we have
73
- data = data.map((item) => ({ ...def, ...item }));
83
+ const normalizedData = rows.map((item) => ({ ...def, ...item }));
74
84
 
75
- const columns = Object.keys(data[0]);
85
+ const columns = Object.keys(normalizedData[0]);
76
86
 
77
87
  const table = new Table({
78
88
  head: columns.map((c) => chalk.cyan.italic.bold(c)),
@@ -95,10 +105,10 @@ export const drawTable = (data: Array<Record<string, any>>): void => {
95
105
  },
96
106
  });
97
107
 
98
- data.forEach((row) => {
108
+ normalizedData.forEach((row) => {
99
109
  const rowValues: any[] = [];
100
- for (const key in row) {
101
- if (row[key] === null) {
110
+ for (const key of columns) {
111
+ if (row[key] == null) {
102
112
  rowValues.push("-");
103
113
  } else if (Array.isArray(row[key])) {
104
114
  rowValues.push(JSON.stringify(row[key]));
@@ -149,6 +149,32 @@ export function getAppwriteDependency(): string {
149
149
  return "appwrite";
150
150
  }
151
151
 
152
+ /**
153
+ * Detects whether the user's project uses native ESM.
154
+ * Returns ".js" for ESM projects (package.json "type": "module" or Deno), "" for non-ESM projects.
155
+ */
156
+ export function detectImportExtension(cwd: string = process.cwd()): string {
157
+ try {
158
+ const pkgPath = path.resolve(cwd, "package.json");
159
+ if (fs.existsSync(pkgPath)) {
160
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
161
+ if (pkg.type === "module") {
162
+ return ".js";
163
+ }
164
+ }
165
+
166
+ if (
167
+ fs.existsSync(path.resolve(cwd, "deno.json")) ||
168
+ fs.existsSync(path.resolve(cwd, "deno.jsonc"))
169
+ ) {
170
+ return ".ts";
171
+ }
172
+ } catch {
173
+ // Fall through to default
174
+ }
175
+ return "";
176
+ }
177
+
152
178
  /**
153
179
  * Checks if the Appwrite dependency supports server-side methods.
154
180
  *
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "type": "module",
4
4
  "homepage": "https://appwrite.io/support",
5
5
  "description": "Appwrite is an open-source self-hosted backend server that abstracts and simplifies complex and repetitive development tasks behind a very simple REST API",
6
- "version": "13.3.0",
6
+ "version": "13.3.2",
7
7
  "license": "BSD-3-Clause",
8
8
  "main": "dist/index.js",
9
9
  "types": "dist/index.d.ts",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/ScoopInstaller/Scoop/master/schema.json",
3
- "version": "13.3.0",
3
+ "version": "13.3.2",
4
4
  "description": "The Appwrite CLI is a command-line application that allows you to interact with Appwrite and perform server-side tasks using your terminal.",
5
5
  "homepage": "https://github.com/appwrite/sdk-for-cli",
6
6
  "license": "BSD-3-Clause",
7
7
  "architecture": {
8
8
  "64bit": {
9
- "url": "https://github.com/appwrite/sdk-for-cli/releases/download/13.3.0/appwrite-cli-win-x64.exe",
9
+ "url": "https://github.com/appwrite/sdk-for-cli/releases/download/13.3.2/appwrite-cli-win-x64.exe",
10
10
  "bin": [
11
11
  [
12
12
  "appwrite-cli-win-x64.exe",
@@ -15,7 +15,7 @@
15
15
  ]
16
16
  },
17
17
  "arm64": {
18
- "url": "https://github.com/appwrite/sdk-for-cli/releases/download/13.3.0/appwrite-cli-win-arm64.exe",
18
+ "url": "https://github.com/appwrite/sdk-for-cli/releases/download/13.3.2/appwrite-cli-win-arm64.exe",
19
19
  "bin": [
20
20
  [
21
21
  "appwrite-cli-win-arm64.exe",