quickbase-js 2.1.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/README.md +700 -90
  2. package/bin/quickbase-js.js +54 -0
  3. package/dist/auth/index.d.ts.map +1 -1
  4. package/dist/auth/index.js +5 -1
  5. package/dist/auth/index.js.map +1 -1
  6. package/dist/auth/ticket.d.ts +13 -0
  7. package/dist/auth/ticket.d.ts.map +1 -1
  8. package/dist/auth/ticket.js +103 -3
  9. package/dist/auth/ticket.js.map +1 -1
  10. package/dist/cli/schema.d.ts +23 -0
  11. package/dist/cli/schema.d.ts.map +1 -0
  12. package/dist/cli/schema.js +425 -0
  13. package/dist/cli/schema.js.map +1 -0
  14. package/dist/client/request.d.ts +2 -1
  15. package/dist/client/request.d.ts.map +1 -1
  16. package/dist/client/request.js +165 -18
  17. package/dist/client/request.js.map +1 -1
  18. package/dist/core/config.d.ts.map +1 -1
  19. package/dist/core/config.js +4 -0
  20. package/dist/core/config.js.map +1 -1
  21. package/dist/core/errors.d.ts +17 -0
  22. package/dist/core/errors.d.ts.map +1 -1
  23. package/dist/core/errors.js +32 -0
  24. package/dist/core/errors.js.map +1 -1
  25. package/dist/core/index.d.ts +2 -2
  26. package/dist/core/index.d.ts.map +1 -1
  27. package/dist/core/index.js +1 -1
  28. package/dist/core/index.js.map +1 -1
  29. package/dist/core/schema.d.ts +37 -0
  30. package/dist/core/schema.d.ts.map +1 -0
  31. package/dist/core/schema.js +168 -0
  32. package/dist/core/schema.js.map +1 -0
  33. package/dist/core/transform.d.ts +36 -0
  34. package/dist/core/transform.d.ts.map +1 -0
  35. package/dist/core/transform.js +205 -0
  36. package/dist/core/transform.js.map +1 -0
  37. package/dist/core/types.d.ts +108 -0
  38. package/dist/core/types.d.ts.map +1 -1
  39. package/dist/core/types.js.map +1 -1
  40. package/dist/index.d.ts +11 -2
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +7 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/quickbase.esm.js +3 -3
  45. package/dist/quickbase.esm.js.map +4 -4
  46. package/dist/quickbase.min.js +3 -3
  47. package/dist/quickbase.min.js.map +4 -4
  48. package/dist/xml/codepages.d.ts +60 -0
  49. package/dist/xml/codepages.d.ts.map +1 -0
  50. package/dist/xml/codepages.js +88 -0
  51. package/dist/xml/codepages.js.map +1 -0
  52. package/dist/xml/dbvars.d.ts +39 -0
  53. package/dist/xml/dbvars.d.ts.map +1 -0
  54. package/dist/xml/dbvars.js +54 -0
  55. package/dist/xml/dbvars.js.map +1 -0
  56. package/dist/xml/errors.d.ts +64 -0
  57. package/dist/xml/errors.d.ts.map +1 -0
  58. package/dist/xml/errors.js +102 -0
  59. package/dist/xml/errors.js.map +1 -0
  60. package/dist/xml/fields.d.ts +45 -0
  61. package/dist/xml/fields.d.ts.map +1 -0
  62. package/dist/xml/fields.js +86 -0
  63. package/dist/xml/fields.js.map +1 -0
  64. package/dist/xml/groups.d.ts +196 -0
  65. package/dist/xml/groups.d.ts.map +1 -0
  66. package/dist/xml/groups.js +424 -0
  67. package/dist/xml/groups.js.map +1 -0
  68. package/dist/xml/html.d.ts +61 -0
  69. package/dist/xml/html.d.ts.map +1 -0
  70. package/dist/xml/html.js +110 -0
  71. package/dist/xml/html.js.map +1 -0
  72. package/dist/xml/index.d.ts +456 -0
  73. package/dist/xml/index.d.ts.map +1 -0
  74. package/dist/xml/index.js +747 -0
  75. package/dist/xml/index.js.map +1 -0
  76. package/dist/xml/metadata.d.ts +49 -0
  77. package/dist/xml/metadata.d.ts.map +1 -0
  78. package/dist/xml/metadata.js +84 -0
  79. package/dist/xml/metadata.js.map +1 -0
  80. package/dist/xml/records.d.ts +106 -0
  81. package/dist/xml/records.d.ts.map +1 -0
  82. package/dist/xml/records.js +220 -0
  83. package/dist/xml/records.js.map +1 -0
  84. package/dist/xml/request.d.ts +129 -0
  85. package/dist/xml/request.d.ts.map +1 -0
  86. package/dist/xml/request.js +190 -0
  87. package/dist/xml/request.js.map +1 -0
  88. package/dist/xml/roles.d.ts +117 -0
  89. package/dist/xml/roles.d.ts.map +1 -0
  90. package/dist/xml/roles.js +241 -0
  91. package/dist/xml/roles.js.map +1 -0
  92. package/dist/xml/schema.d.ts +94 -0
  93. package/dist/xml/schema.d.ts.map +1 -0
  94. package/dist/xml/schema.js +354 -0
  95. package/dist/xml/schema.js.map +1 -0
  96. package/dist/xml/transform.d.ts +154 -0
  97. package/dist/xml/transform.d.ts.map +1 -0
  98. package/dist/xml/transform.js +182 -0
  99. package/dist/xml/transform.js.map +1 -0
  100. package/dist/xml/types.d.ts +531 -0
  101. package/dist/xml/types.d.ts.map +1 -0
  102. package/dist/xml/types.js +22 -0
  103. package/dist/xml/types.js.map +1 -0
  104. package/dist/xml/users.d.ts +92 -0
  105. package/dist/xml/users.d.ts.map +1 -0
  106. package/dist/xml/users.js +166 -0
  107. package/dist/xml/users.js.map +1 -0
  108. package/dist/xml/webhooks.d.ts +98 -0
  109. package/dist/xml/webhooks.d.ts.map +1 -0
  110. package/dist/xml/webhooks.js +202 -0
  111. package/dist/xml/webhooks.js.map +1 -0
  112. package/package.json +6 -2
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * QuickBase JS SDK CLI
4
+ *
5
+ * Available commands:
6
+ * schema Generate schema from QuickBase application
7
+ */
8
+
9
+ import { fileURLToPath } from 'url';
10
+ import { dirname, join } from 'path';
11
+
12
+ const __dirname = dirname(fileURLToPath(import.meta.url));
13
+
14
+ async function main() {
15
+ const args = process.argv.slice(2);
16
+ const command = args[0];
17
+
18
+ switch (command) {
19
+ case 'schema':
20
+ const { main: schemaMain } = await import(
21
+ join(__dirname, '..', 'dist', 'cli', 'schema.js')
22
+ );
23
+ await schemaMain(args.slice(1));
24
+ break;
25
+
26
+ case '--help':
27
+ case '-h':
28
+ case undefined:
29
+ console.log(`
30
+ quickbase-js - QuickBase SDK CLI
31
+
32
+ Commands:
33
+ schema Generate schema from QuickBase application
34
+
35
+ Usage:
36
+ npx quickbase-js <command> [options]
37
+
38
+ Examples:
39
+ npx quickbase-js schema --help
40
+ npx quickbase-js schema -r mycompany -a bqw123abc -t token
41
+ `);
42
+ break;
43
+
44
+ default:
45
+ console.error(`Unknown command: ${command}`);
46
+ console.error('Run "npx quickbase-js --help" for available commands');
47
+ process.exit(1);
48
+ }
49
+ }
50
+
51
+ main().catch((error) => {
52
+ console.error('Error:', error.message);
53
+ process.exit(1);
54
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAM5D;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,WAAW,GACnB,YAAY,CA0Bd"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAM5D;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,WAAW,GACnB,YAAY,CA8Bd"}
@@ -26,7 +26,11 @@ export function createAuthStrategy(authConfig, context) {
26
26
  return new SsoTokenStrategy(authConfig.samlToken, context);
27
27
  // XML-API-TICKET: Remove this case if XML API is discontinued
28
28
  case 'ticket':
29
- return new TicketStrategy(authConfig.username, authConfig.password, { hours: authConfig.hours }, context);
29
+ return new TicketStrategy(authConfig.username, authConfig.password, {
30
+ hours: authConfig.hours,
31
+ onExpired: authConfig.onExpired,
32
+ persist: authConfig.persist,
33
+ }, context);
30
34
  default:
31
35
  throw new Error(`Unknown auth type: ${authConfig.type}`);
32
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC,CAAC,iDAAiD;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC,CAAC,iDAAiD;AAE/F;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAAsB,EACtB,OAAoB;IAEpB,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,YAAY;YACf,OAAO,IAAI,iBAAiB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAE9D,KAAK,YAAY;YACf,OAAO,IAAI,iBAAiB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE;gBAC1D,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,eAAe,EAAE,UAAU,CAAC,eAAe;aAC5C,CAAC,CAAC;QAEL,KAAK,KAAK;YACR,OAAO,IAAI,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAE7D,8DAA8D;QAC9D,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CACvB,UAAU,CAAC,QAAQ,EACnB,UAAU,CAAC,QAAQ,EACnB,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,EAC3B,OAAO,CACR,CAAC;QAEJ;YACE,MAAM,IAAI,KAAK,CAAC,sBAAuB,UAA+B,CAAC,IAAI,EAAE,CAAC,CAAC;IACnF,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC,CAAC,iDAAiD;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC,CAAC,iDAAiD;AAE/F;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAAsB,EACtB,OAAoB;IAEpB,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,YAAY;YACf,OAAO,IAAI,iBAAiB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAE9D,KAAK,YAAY;YACf,OAAO,IAAI,iBAAiB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE;gBAC1D,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,eAAe,EAAE,UAAU,CAAC,eAAe;aAC5C,CAAC,CAAC;QAEL,KAAK,KAAK;YACR,OAAO,IAAI,gBAAgB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAE7D,8DAA8D;QAC9D,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CACvB,UAAU,CAAC,QAAQ,EACnB,UAAU,CAAC,QAAQ,EACnB;gBACE,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,SAAS,EAAE,UAAU,CAAC,SAAS;gBAC/B,OAAO,EAAE,UAAU,CAAC,OAAO;aAC5B,EACD,OAAO,CACR,CAAC;QAEJ;YACE,MAAM,IAAI,KAAK,CAAC,sBAAuB,UAA+B,CAAC,IAAI,EAAE,CAAC,CAAC;IACnF,CAAC;AACH,CAAC"}
@@ -26,6 +26,10 @@ import type { AuthStrategy, AuthContext } from './types.js';
26
26
  export interface TicketAuthOptions {
27
27
  /** Ticket validity in hours (default: 12, max: 4380 ~6 months) */
28
28
  hours?: number;
29
+ /** Callback invoked when ticket expires - use to show login UI */
30
+ onExpired?: () => void;
31
+ /** Persist ticket to storage for session survival (default: none) */
32
+ persist?: 'sessionStorage' | 'localStorage';
29
33
  }
30
34
  /**
31
35
  * Ticket authentication strategy using XML API_Authenticate.
@@ -51,8 +55,12 @@ export declare class TicketStrategy implements AuthStrategy {
51
55
  private readonly realm;
52
56
  private readonly fetchApi;
53
57
  private readonly logger;
58
+ private readonly onExpired?;
59
+ private readonly persist?;
60
+ private readonly storageKey;
54
61
  private ticket;
55
62
  private userId;
63
+ private expiresAt;
56
64
  private authenticated;
57
65
  private pendingAuth;
58
66
  constructor(username: string, password: string, options: TicketAuthOptions | undefined, context: AuthContext);
@@ -60,6 +68,7 @@ export declare class TicketStrategy implements AuthStrategy {
60
68
  getAuthorizationHeader(token: string): string;
61
69
  handleAuthError(_dbid?: string): Promise<boolean>;
62
70
  invalidate(_dbid?: string): void;
71
+ private clearTicket;
63
72
  /**
64
73
  * Get the authenticated user's ID (available after first API call)
65
74
  */
@@ -67,5 +76,9 @@ export declare class TicketStrategy implements AuthStrategy {
67
76
  private authenticate;
68
77
  private parseXmlResponse;
69
78
  private escapeXml;
79
+ private getStorage;
80
+ private saveToStorage;
81
+ private restoreFromStorage;
82
+ private clearFromStorage;
70
83
  }
71
84
  //# sourceMappingURL=ticket.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ticket.d.ts","sourceRoot":"","sources":["../../src/auth/ticket.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAW5D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,cAAe,YAAW,YAAY;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAEhC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAgC;gBAGjD,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,iBAAiB,GAAG,SAAS,EACtC,OAAO,EAAE,WAAW;IAUhB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyB/C,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIvC,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASvD,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAIhC;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,IAAI;YAIZ,YAAY;IAkD1B,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,SAAS;CAQlB"}
1
+ {"version":3,"file":"ticket.d.ts","sourceRoot":"","sources":["../../src/auth/ticket.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAW5D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,qEAAqE;IACrE,OAAO,CAAC,EAAE,gBAAgB,GAAG,cAAc,CAAC;CAC7C;AASD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,cAAe,YAAW,YAAY;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAoC;IAC7D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAgC;gBAGjD,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,iBAAiB,GAAG,SAAS,EACtC,OAAO,EAAE,WAAW;IAgBhB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiC/C,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIvC,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUvD,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAIhC,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,IAAI;YAIZ,YAAY;IAuD1B,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,kBAAkB;IA+B1B,OAAO,CAAC,gBAAgB;CAWzB"}
@@ -43,25 +43,41 @@ export class TicketStrategy {
43
43
  realm;
44
44
  fetchApi;
45
45
  logger;
46
+ onExpired;
47
+ persist;
48
+ storageKey;
46
49
  ticket = null;
47
50
  userId = null;
51
+ expiresAt = null;
48
52
  authenticated = false;
49
53
  pendingAuth = null;
50
54
  constructor(username, password, options, context) {
51
55
  this.username = username;
52
56
  this.password = password;
53
57
  this.hours = Math.min(Math.max(options?.hours ?? 12, 1), 4380);
58
+ this.onExpired = options?.onExpired;
59
+ this.persist = options?.persist;
54
60
  this.realm = context.realm;
55
61
  this.fetchApi = context.fetchApi;
56
62
  this.logger = context.logger;
63
+ this.storageKey = `qb_ticket_${this.realm}`;
64
+ // Try to restore ticket from storage
65
+ this.restoreFromStorage();
57
66
  }
58
67
  async getToken(_dbid) {
59
- // Return cached ticket if available
60
- if (this.ticket) {
68
+ // Return cached ticket if available and not expired
69
+ if (this.ticket && this.expiresAt && Date.now() < this.expiresAt) {
61
70
  return this.ticket;
62
71
  }
72
+ // If ticket existed but expired, clear it
73
+ if (this.ticket && this.expiresAt && Date.now() >= this.expiresAt) {
74
+ this.clearTicket();
75
+ this.onExpired?.();
76
+ throw new Error('Ticket expired; create a new client with fresh credentials');
77
+ }
63
78
  // If already authenticated but no ticket, it expired
64
79
  if (this.authenticated) {
80
+ this.onExpired?.();
65
81
  throw new Error('Ticket expired; create a new client with fresh credentials');
66
82
  }
67
83
  // Dedupe concurrent auth requests
@@ -82,13 +98,19 @@ export class TicketStrategy {
82
98
  }
83
99
  async handleAuthError(_dbid) {
84
100
  // Clear expired ticket
85
- this.ticket = null;
101
+ this.clearTicket();
86
102
  // Can't refresh - password was cleared after initial auth
87
103
  this.logger.debug('Ticket auth error - cannot refresh (password was cleared)');
104
+ this.onExpired?.();
88
105
  return false;
89
106
  }
90
107
  invalidate(_dbid) {
108
+ this.clearTicket();
109
+ }
110
+ clearTicket() {
91
111
  this.ticket = null;
112
+ this.expiresAt = null;
113
+ this.clearFromStorage();
92
114
  }
93
115
  /**
94
116
  * Get the authenticated user's ID (available after first API call)
@@ -98,6 +120,7 @@ export class TicketStrategy {
98
120
  }
99
121
  async authenticate() {
100
122
  if (!this.password) {
123
+ this.onExpired?.();
101
124
  throw new Error('Ticket expired; create a new client with fresh credentials');
102
125
  }
103
126
  const url = `https://${this.realm}.quickbase.com/db/main`;
@@ -128,7 +151,10 @@ export class TicketStrategy {
128
151
  // Store ticket and user ID
129
152
  this.ticket = result.ticket;
130
153
  this.userId = result.userid;
154
+ this.expiresAt = Date.now() + this.hours * 60 * 60 * 1000;
131
155
  this.authenticated = true;
156
+ // Save to storage if persistence is enabled
157
+ this.saveToStorage();
132
158
  // Clear password from memory
133
159
  this.password = null;
134
160
  this.logger.debug(`Authenticated successfully, userId: ${this.userId}`);
@@ -156,5 +182,79 @@ export class TicketStrategy {
156
182
  .replace(/"/g, '&quot;')
157
183
  .replace(/'/g, '&apos;');
158
184
  }
185
+ getStorage() {
186
+ if (!this.persist)
187
+ return null;
188
+ try {
189
+ // Check if we're in a browser environment
190
+ if (typeof globalThis === 'undefined')
191
+ return null;
192
+ const win = globalThis;
193
+ const storage = this.persist === 'localStorage' ? win.localStorage : win.sessionStorage;
194
+ return storage ?? null;
195
+ }
196
+ catch {
197
+ // Storage may be disabled (e.g., private browsing)
198
+ return null;
199
+ }
200
+ }
201
+ saveToStorage() {
202
+ const storage = this.getStorage();
203
+ if (!storage || !this.ticket || !this.userId || !this.expiresAt)
204
+ return;
205
+ try {
206
+ const data = {
207
+ ticket: this.ticket,
208
+ userId: this.userId,
209
+ expiresAt: this.expiresAt,
210
+ };
211
+ storage.setItem(this.storageKey, JSON.stringify(data));
212
+ this.logger.debug(`Ticket saved to ${this.persist}`);
213
+ }
214
+ catch {
215
+ // Storage quota exceeded or other error - ignore
216
+ this.logger.debug(`Failed to save ticket to ${this.persist}`);
217
+ }
218
+ }
219
+ restoreFromStorage() {
220
+ const storage = this.getStorage();
221
+ if (!storage)
222
+ return;
223
+ try {
224
+ const json = storage.getItem(this.storageKey);
225
+ if (!json)
226
+ return;
227
+ const data = JSON.parse(json);
228
+ // Check if ticket is still valid (with 1 minute buffer)
229
+ if (Date.now() >= data.expiresAt - 60000) {
230
+ storage.removeItem(this.storageKey);
231
+ this.logger.debug('Stored ticket expired, removed from storage');
232
+ return;
233
+ }
234
+ this.ticket = data.ticket;
235
+ this.userId = data.userId;
236
+ this.expiresAt = data.expiresAt;
237
+ this.authenticated = true;
238
+ // Password stays null since we have a valid ticket
239
+ this.password = null;
240
+ this.logger.debug(`Ticket restored from ${this.persist}`);
241
+ }
242
+ catch {
243
+ // Invalid JSON or other error - clear storage
244
+ storage.removeItem(this.storageKey);
245
+ }
246
+ }
247
+ clearFromStorage() {
248
+ const storage = this.getStorage();
249
+ if (!storage)
250
+ return;
251
+ try {
252
+ storage.removeItem(this.storageKey);
253
+ this.logger.debug(`Ticket cleared from ${this.persist}`);
254
+ }
255
+ catch {
256
+ // Ignore errors
257
+ }
258
+ }
159
259
  }
160
260
  //# sourceMappingURL=ticket.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ticket.js","sourceRoot":"","sources":["../../src/auth/ticket.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ticket.js","sourceRoot":"","sources":["../../src/auth/ticket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI Schema Generator
4
+ *
5
+ * Generates a schema definition from a QuickBase application.
6
+ *
7
+ * Usage:
8
+ * npx quickbase-js schema --realm <realm> --app <appId> --token <token>
9
+ *
10
+ * Options:
11
+ * --realm QuickBase realm (e.g., "mycompany")
12
+ * --app Application ID (e.g., "bqw123abc")
13
+ * --token User token for authentication (or set QB_USER_TOKEN env var)
14
+ * --output Output file path (default: stdout)
15
+ * --format Output format: "ts" or "json" (default: "ts")
16
+ * --merge Merge with existing schema file, preserving custom aliases
17
+ * --help Show help
18
+ */
19
+ /**
20
+ * Main CLI entry point
21
+ */
22
+ export declare function main(args: string[]): Promise<void>;
23
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/cli/schema.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG;AAkZH;;GAEG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgFxD"}