@ariadng/sheets 0.4.0 → 0.4.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.
Files changed (47) hide show
  1. package/dist/cli.cjs +1610 -0
  2. package/dist/cli.cjs.map +1 -0
  3. package/dist/cli.d.cts +1 -0
  4. package/dist/cli.d.ts +0 -6
  5. package/dist/cli.js +1318 -595
  6. package/dist/cli.js.map +1 -1
  7. package/dist/index.cjs +858 -0
  8. package/dist/index.cjs.map +1 -0
  9. package/dist/index.d.cts +356 -0
  10. package/dist/index.d.ts +355 -10
  11. package/dist/index.js +810 -11
  12. package/dist/index.js.map +1 -1
  13. package/package.json +5 -3
  14. package/dist/api/index.d.ts +0 -60
  15. package/dist/api/index.d.ts.map +0 -1
  16. package/dist/api/index.js +0 -347
  17. package/dist/api/index.js.map +0 -1
  18. package/dist/auth/constants.d.ts +0 -13
  19. package/dist/auth/constants.d.ts.map +0 -1
  20. package/dist/auth/constants.js +0 -21
  21. package/dist/auth/constants.js.map +0 -1
  22. package/dist/auth/index.d.ts +0 -13
  23. package/dist/auth/index.d.ts.map +0 -1
  24. package/dist/auth/index.js +0 -22
  25. package/dist/auth/index.js.map +0 -1
  26. package/dist/auth/oauth.d.ts +0 -32
  27. package/dist/auth/oauth.d.ts.map +0 -1
  28. package/dist/auth/oauth.js +0 -80
  29. package/dist/auth/oauth.js.map +0 -1
  30. package/dist/auth/service-account.d.ts +0 -18
  31. package/dist/auth/service-account.d.ts.map +0 -1
  32. package/dist/auth/service-account.js +0 -92
  33. package/dist/auth/service-account.js.map +0 -1
  34. package/dist/auth/user-auth.d.ts +0 -24
  35. package/dist/auth/user-auth.d.ts.map +0 -1
  36. package/dist/auth/user-auth.js +0 -230
  37. package/dist/auth/user-auth.js.map +0 -1
  38. package/dist/cli.d.ts.map +0 -1
  39. package/dist/http/index.d.ts +0 -19
  40. package/dist/http/index.d.ts.map +0 -1
  41. package/dist/http/index.js +0 -68
  42. package/dist/http/index.js.map +0 -1
  43. package/dist/index.d.ts.map +0 -1
  44. package/dist/types/index.d.ts +0 -200
  45. package/dist/types/index.d.ts.map +0 -1
  46. package/dist/types/index.js +0 -16
  47. package/dist/types/index.js.map +0 -1
@@ -1,21 +0,0 @@
1
- /**
2
- * OAuth Client Constants
3
- * Replace with your Google Cloud OAuth client credentials
4
- */
5
- // Built-in OAuth client (Desktop app type)
6
- // Project: ariadng-sheets
7
- export const OAUTH_CLIENT_ID = '344941894490-jmdvo5ghomqi7vuisfrf80hfassk1ma5.apps.googleusercontent.com';
8
- export const OAUTH_CLIENT_SECRET = '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';
9
- // Redirect URI for local callback server
10
- export const OAUTH_REDIRECT_URI = 'http://localhost:8085/callback';
11
- export const OAUTH_CALLBACK_PORT = 8085;
12
- // OAuth endpoints
13
- export const OAUTH_AUTH_URL = 'https://accounts.google.com/o/oauth2/v2/auth';
14
- export const OAUTH_TOKEN_URL = 'https://oauth2.googleapis.com/token';
15
- export const OAUTH_USERINFO_URL = 'https://www.googleapis.com/oauth2/v2/userinfo';
16
- // Scopes
17
- export const OAUTH_SCOPES = [
18
- 'https://www.googleapis.com/auth/spreadsheets',
19
- 'https://www.googleapis.com/auth/userinfo.email',
20
- ];
21
- //# sourceMappingURL=constants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/auth/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,2CAA2C;AAC3C,0BAA0B;AAC1B,MAAM,CAAC,MAAM,eAAe,GAAG,0EAA0E,CAAC;AAC1G,MAAM,CAAC,MAAM,mBAAmB,GAAG,qCAAqC,CAAC;AAEzE,yCAAyC;AACzC,MAAM,CAAC,MAAM,kBAAkB,GAAG,gCAAgC,CAAC;AACnE,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAExC,kBAAkB;AAClB,MAAM,CAAC,MAAM,cAAc,GAAG,8CAA8C,CAAC;AAC7E,MAAM,CAAC,MAAM,eAAe,GAAG,qCAAqC,CAAC;AACrE,MAAM,CAAC,MAAM,kBAAkB,GAAG,+CAA+C,CAAC;AAElF,SAAS;AACT,MAAM,CAAC,MAAM,YAAY,GAAG;IACxB,8CAA8C;IAC9C,gDAAgD;CACnD,CAAC"}
@@ -1,13 +0,0 @@
1
- /**
2
- * Authentication Module Exports
3
- */
4
- import type { AuthConfig } from '../types/index.js';
5
- export { OAuthAuth } from './oauth.js';
6
- export { ServiceAccountAuth } from './service-account.js';
7
- export { UserAuth, login, loadStoredTokens, deleteTokens } from './user-auth.js';
8
- export type { OAuthClientCredentials } from './user-auth.js';
9
- export interface AuthProvider {
10
- getAccessToken(): Promise<string>;
11
- }
12
- export declare function createAuthProvider(config: AuthConfig): AuthProvider;
13
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAKpD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACjF,YAAY,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE7D,MAAM,WAAW,YAAY;IACzB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACrC;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CAWnE"}
@@ -1,22 +0,0 @@
1
- /**
2
- * Authentication Module Exports
3
- */
4
- import { OAuthAuth } from './oauth.js';
5
- import { ServiceAccountAuth } from './service-account.js';
6
- import { UserAuth } from './user-auth.js';
7
- export { OAuthAuth } from './oauth.js';
8
- export { ServiceAccountAuth } from './service-account.js';
9
- export { UserAuth, login, loadStoredTokens, deleteTokens } from './user-auth.js';
10
- export function createAuthProvider(config) {
11
- switch (config.type) {
12
- case 'oauth':
13
- return new OAuthAuth(config);
14
- case 'service-account':
15
- return new ServiceAccountAuth(config);
16
- case 'user':
17
- return new UserAuth();
18
- default:
19
- throw new Error(`Unknown auth type: ${config.type}`);
20
- }
21
- }
22
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAOjF,MAAM,UAAU,kBAAkB,CAAC,MAAkB;IACjD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,OAAO;YACR,OAAO,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,iBAAiB;YAClB,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC1C,KAAK,MAAM;YACP,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC1B;YACI,MAAM,IAAI,KAAK,CAAC,sBAAuB,MAA2B,CAAC,IAAI,EAAE,CAAC,CAAC;IACnF,CAAC;AACL,CAAC"}
@@ -1,32 +0,0 @@
1
- /**
2
- * OAuth 2.0 Authentication
3
- * Supports pre-obtained access tokens with optional auto-refresh
4
- *
5
- * For automation (e.g., n8n), provide:
6
- * - accessToken: Current access token
7
- * - refreshToken: For obtaining new tokens when expired
8
- * - clientId: OAuth client ID
9
- * - clientSecret: OAuth client secret
10
- * - expiresAt: When the access token expires (Unix timestamp in ms)
11
- */
12
- import type { OAuthConfig } from '../types/index.js';
13
- export declare class OAuthAuth {
14
- private config;
15
- private cachedToken;
16
- private expiresAt;
17
- constructor(config: OAuthConfig);
18
- getAccessToken(): Promise<string>;
19
- private canRefresh;
20
- private isExpired;
21
- private refreshToken;
22
- /**
23
- * Get current token state for persistence in automation tools
24
- * Returns updated tokens after any refresh operations
25
- */
26
- getTokenState(): {
27
- accessToken: string;
28
- refreshToken?: string;
29
- expiresAt: number;
30
- };
31
- }
32
- //# sourceMappingURL=oauth.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAUrD,qBAAa,SAAS;IAClB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,WAAW;IAMzB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAcvC,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,SAAS;YAIH,YAAY;IAgC1B;;;OAGG;IACH,aAAa,IAAI;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;CAOrF"}
@@ -1,80 +0,0 @@
1
- /**
2
- * OAuth 2.0 Authentication
3
- * Supports pre-obtained access tokens with optional auto-refresh
4
- *
5
- * For automation (e.g., n8n), provide:
6
- * - accessToken: Current access token
7
- * - refreshToken: For obtaining new tokens when expired
8
- * - clientId: OAuth client ID
9
- * - clientSecret: OAuth client secret
10
- * - expiresAt: When the access token expires (Unix timestamp in ms)
11
- */
12
- import { OAUTH_TOKEN_URL } from './constants.js';
13
- export class OAuthAuth {
14
- config;
15
- cachedToken;
16
- expiresAt;
17
- constructor(config) {
18
- this.config = config;
19
- this.cachedToken = config.accessToken;
20
- this.expiresAt = config.expiresAt || 0;
21
- }
22
- async getAccessToken() {
23
- // If no expiration tracking or no refresh credentials, return cached token
24
- if (!this.canRefresh()) {
25
- return this.cachedToken;
26
- }
27
- // Check if token is expired (with 60 second buffer)
28
- if (this.isExpired()) {
29
- await this.refreshToken();
30
- }
31
- return this.cachedToken;
32
- }
33
- canRefresh() {
34
- return !!(this.config.refreshToken &&
35
- this.config.clientId &&
36
- this.config.clientSecret &&
37
- this.expiresAt > 0);
38
- }
39
- isExpired() {
40
- return Date.now() >= this.expiresAt - 60000;
41
- }
42
- async refreshToken() {
43
- if (!this.config.refreshToken || !this.config.clientId || !this.config.clientSecret) {
44
- throw new Error('Token expired and missing refresh credentials (refreshToken, clientId, clientSecret)');
45
- }
46
- const response = await fetch(OAUTH_TOKEN_URL, {
47
- method: 'POST',
48
- headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
49
- body: new URLSearchParams({
50
- client_id: this.config.clientId,
51
- client_secret: this.config.clientSecret,
52
- refresh_token: this.config.refreshToken,
53
- grant_type: 'refresh_token',
54
- }),
55
- });
56
- if (!response.ok) {
57
- const error = await response.text();
58
- throw new Error(`Token refresh failed: ${error}`);
59
- }
60
- const tokenResponse = await response.json();
61
- this.cachedToken = tokenResponse.access_token;
62
- this.expiresAt = Date.now() + (tokenResponse.expires_in * 1000);
63
- // Update config with new refresh token if provided
64
- if (tokenResponse.refresh_token) {
65
- this.config.refreshToken = tokenResponse.refresh_token;
66
- }
67
- }
68
- /**
69
- * Get current token state for persistence in automation tools
70
- * Returns updated tokens after any refresh operations
71
- */
72
- getTokenState() {
73
- return {
74
- accessToken: this.cachedToken,
75
- refreshToken: this.config.refreshToken,
76
- expiresAt: this.expiresAt,
77
- };
78
- }
79
- }
80
- //# sourceMappingURL=oauth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AASjD,MAAM,OAAO,SAAS;IACV,MAAM,CAAc;IACpB,WAAW,CAAS;IACpB,SAAS,CAAS;IAE1B,YAAY,MAAmB;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,cAAc;QAChB,2EAA2E;QAC3E,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,WAAW,CAAC;QAC5B,CAAC;QAED,oDAAoD;QACpD,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC9B,CAAC;QAED,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAEO,UAAU;QACd,OAAO,CAAC,CAAC,CACL,IAAI,CAAC,MAAM,CAAC,YAAY;YACxB,IAAI,CAAC,MAAM,CAAC,QAAQ;YACpB,IAAI,CAAC,MAAM,CAAC,YAAY;YACxB,IAAI,CAAC,SAAS,GAAG,CAAC,CACrB,CAAC;IACN,CAAC;IAEO,SAAS;QACb,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IAChD,CAAC;IAEO,KAAK,CAAC,YAAY;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAClF,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAC;QAC5G,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI,EAAE,IAAI,eAAe,CAAC;gBACtB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC/B,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;gBACvC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;gBACvC,UAAU,EAAE,eAAe;aAC9B,CAAC;SACL,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAmB,CAAC;QAE7D,IAAI,CAAC,WAAW,GAAG,aAAa,CAAC,YAAY,CAAC;QAC9C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;QAEhE,mDAAmD;QACnD,IAAI,aAAa,CAAC,aAAa,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,aAAa,CAAC,aAAa,CAAC;QAC3D,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,aAAa;QACT,OAAO;YACH,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;YACtC,SAAS,EAAE,IAAI,CAAC,SAAS;SAC5B,CAAC;IACN,CAAC;CACJ"}
@@ -1,18 +0,0 @@
1
- /**
2
- * Service Account JWT Authentication
3
- * Uses RS256 signing to exchange JWT for access token
4
- */
5
- import type { ServiceAccountConfig } from '../types/index.js';
6
- export declare class ServiceAccountAuth {
7
- private config;
8
- private credentials;
9
- private cachedToken;
10
- private tokenExpiresAt;
11
- constructor(config: ServiceAccountConfig);
12
- getAccessToken(): Promise<string>;
13
- private loadCredentials;
14
- private createJwt;
15
- private base64UrlEncode;
16
- private exchangeJwtForToken;
17
- }
18
- //# sourceMappingURL=service-account.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service-account.d.ts","sourceRoot":"","sources":["../../src/auth/service-account.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,oBAAoB,EAA6B,MAAM,mBAAmB,CAAC;AAYzF,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAA0C;IAC7D,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,cAAc,CAAa;gBAEvB,MAAM,EAAE,oBAAoB;IAIlC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;YAezB,eAAe;IAgB7B,OAAO,CAAC,SAAS;IAgCjB,OAAO,CAAC,eAAe;YAQT,mBAAmB;CAmBpC"}
@@ -1,92 +0,0 @@
1
- /**
2
- * Service Account JWT Authentication
3
- * Uses RS256 signing to exchange JWT for access token
4
- */
5
- import * as crypto from 'crypto';
6
- import * as fs from 'fs/promises';
7
- const TOKEN_URI = 'https://oauth2.googleapis.com/token';
8
- const SCOPE = 'https://www.googleapis.com/auth/spreadsheets.readonly';
9
- const TOKEN_LIFETIME_SECONDS = 3600;
10
- export class ServiceAccountAuth {
11
- config;
12
- credentials = null;
13
- cachedToken = null;
14
- tokenExpiresAt = 0;
15
- constructor(config) {
16
- this.config = config;
17
- }
18
- async getAccessToken() {
19
- if (this.cachedToken && Date.now() < this.tokenExpiresAt - 60000) {
20
- return this.cachedToken;
21
- }
22
- await this.loadCredentials();
23
- const jwt = this.createJwt();
24
- const token = await this.exchangeJwtForToken(jwt);
25
- this.cachedToken = token.access_token;
26
- this.tokenExpiresAt = Date.now() + (token.expires_in * 1000);
27
- return this.cachedToken;
28
- }
29
- async loadCredentials() {
30
- if (this.credentials)
31
- return;
32
- if (this.config.credentials) {
33
- this.credentials = this.config.credentials;
34
- return;
35
- }
36
- if (!this.config.credentialsPath) {
37
- throw new Error('Service account requires credentialsPath or credentials');
38
- }
39
- const content = await fs.readFile(this.config.credentialsPath, 'utf-8');
40
- this.credentials = JSON.parse(content);
41
- }
42
- createJwt() {
43
- if (!this.credentials) {
44
- throw new Error('Credentials not loaded');
45
- }
46
- const now = Math.floor(Date.now() / 1000);
47
- const header = {
48
- alg: 'RS256',
49
- typ: 'JWT',
50
- };
51
- const payload = {
52
- iss: this.credentials.client_email,
53
- scope: SCOPE,
54
- aud: TOKEN_URI,
55
- iat: now,
56
- exp: now + TOKEN_LIFETIME_SECONDS,
57
- };
58
- const encodedHeader = this.base64UrlEncode(JSON.stringify(header));
59
- const encodedPayload = this.base64UrlEncode(JSON.stringify(payload));
60
- const signatureInput = `${encodedHeader}.${encodedPayload}`;
61
- const sign = crypto.createSign('RSA-SHA256');
62
- sign.update(signatureInput);
63
- const signature = sign.sign(this.credentials.private_key);
64
- const encodedSignature = this.base64UrlEncode(signature);
65
- return `${signatureInput}.${encodedSignature}`;
66
- }
67
- base64UrlEncode(input) {
68
- const buffer = typeof input === 'string' ? Buffer.from(input) : input;
69
- return buffer.toString('base64')
70
- .replace(/\+/g, '-')
71
- .replace(/\//g, '_')
72
- .replace(/=+$/, '');
73
- }
74
- async exchangeJwtForToken(jwt) {
75
- const response = await fetch(TOKEN_URI, {
76
- method: 'POST',
77
- headers: {
78
- 'Content-Type': 'application/x-www-form-urlencoded',
79
- },
80
- body: new URLSearchParams({
81
- grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
82
- assertion: jwt,
83
- }),
84
- });
85
- if (!response.ok) {
86
- const error = await response.text();
87
- throw new Error(`Token exchange failed: ${error}`);
88
- }
89
- return await response.json();
90
- }
91
- }
92
- //# sourceMappingURL=service-account.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service-account.js","sourceRoot":"","sources":["../../src/auth/service-account.ts"],"names":[],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- /**
2
- * User OAuth Authentication
3
- * OAuth 2.0 Authorization Code flow with PKCE for personal Google accounts
4
- */
5
- import type { StoredTokens } from '../types/index.js';
6
- export interface OAuthClientCredentials {
7
- clientId: string;
8
- clientSecret: string;
9
- }
10
- interface PKCEPair {
11
- codeVerifier: string;
12
- codeChallenge: string;
13
- }
14
- export declare function generatePKCE(): PKCEPair;
15
- export declare function getAuthorizationUrl(codeChallenge: string, clientId?: string): string;
16
- export declare function loadStoredTokens(): Promise<StoredTokens | null>;
17
- export declare function deleteTokens(): Promise<void>;
18
- export declare function login(credentials?: OAuthClientCredentials): Promise<StoredTokens>;
19
- export declare class UserAuth {
20
- private tokens;
21
- getAccessToken(): Promise<string>;
22
- }
23
- export {};
24
- //# sourceMappingURL=user-auth.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user-auth.d.ts","sourceRoot":"","sources":["../../src/auth/user-auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAYtD,MAAM,WAAW,sBAAsB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACxB;AAOD,UAAU,QAAQ;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,YAAY,IAAI,QAAQ,CAOvC;AAqFD,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAapF;AAkFD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAOrE;AAOD,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAMlD;AAID,wBAAsB,KAAK,CAAC,WAAW,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CA2BvF;AAID,qBAAa,QAAQ;IACjB,OAAO,CAAC,MAAM,CAA6B;IAErC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;CA4B1C"}
@@ -1,230 +0,0 @@
1
- /**
2
- * User OAuth Authentication
3
- * OAuth 2.0 Authorization Code flow with PKCE for personal Google accounts
4
- */
5
- import * as crypto from 'crypto';
6
- import * as fs from 'fs/promises';
7
- import * as http from 'http';
8
- import * as os from 'os';
9
- import * as path from 'path';
10
- import { exec } from 'child_process';
11
- import { OAUTH_CLIENT_ID, OAUTH_CLIENT_SECRET, OAUTH_REDIRECT_URI, OAUTH_CALLBACK_PORT, OAUTH_AUTH_URL, OAUTH_TOKEN_URL, OAUTH_USERINFO_URL, OAUTH_SCOPES, } from './constants.js';
12
- const CONFIG_DIR = path.join(os.homedir(), '.sheets');
13
- const TOKENS_FILE = path.join(CONFIG_DIR, 'tokens.json');
14
- export function generatePKCE() {
15
- const codeVerifier = crypto.randomBytes(32).toString('base64url');
16
- const codeChallenge = crypto
17
- .createHash('sha256')
18
- .update(codeVerifier)
19
- .digest('base64url');
20
- return { codeVerifier, codeChallenge };
21
- }
22
- // === Browser ===
23
- function openBrowser(url) {
24
- return new Promise((resolve, reject) => {
25
- const platform = process.platform;
26
- let command;
27
- if (platform === 'darwin') {
28
- command = `open "${url}"`;
29
- }
30
- else if (platform === 'win32') {
31
- command = `start "" "${url}"`;
32
- }
33
- else {
34
- command = `xdg-open "${url}"`;
35
- }
36
- exec(command, (error) => {
37
- if (error) {
38
- reject(new Error(`Failed to open browser: ${error.message}`));
39
- }
40
- else {
41
- resolve();
42
- }
43
- });
44
- });
45
- }
46
- // === Callback Server ===
47
- function startCallbackServer() {
48
- return new Promise((resolve, reject) => {
49
- let timeoutId;
50
- const server = http.createServer((req, res) => {
51
- const url = new URL(req.url || '', `http://localhost:${OAUTH_CALLBACK_PORT}`);
52
- if (url.pathname === '/callback') {
53
- const code = url.searchParams.get('code');
54
- const error = url.searchParams.get('error');
55
- if (error) {
56
- res.writeHead(400, { 'Content-Type': 'text/html' });
57
- res.end('<html><body><h1>Authorization Failed</h1><p>You can close this window.</p></body></html>');
58
- clearTimeout(timeoutId);
59
- server.close();
60
- reject(new Error(`Authorization error: ${error}`));
61
- return;
62
- }
63
- if (code) {
64
- res.writeHead(200, { 'Content-Type': 'text/html' });
65
- res.end('<html><body><h1>Authorization Successful</h1><p>You can close this window.</p></body></html>');
66
- clearTimeout(timeoutId);
67
- server.close();
68
- resolve(code);
69
- return;
70
- }
71
- res.writeHead(400, { 'Content-Type': 'text/html' });
72
- res.end('<html><body><h1>Missing Code</h1></body></html>');
73
- }
74
- else {
75
- res.writeHead(404);
76
- res.end();
77
- }
78
- });
79
- server.on('error', (err) => {
80
- clearTimeout(timeoutId);
81
- reject(new Error(`Callback server error: ${err.message}`));
82
- });
83
- server.listen(OAUTH_CALLBACK_PORT, () => {
84
- // Server started, waiting for callback
85
- });
86
- // Timeout after 5 minutes
87
- timeoutId = setTimeout(() => {
88
- server.close();
89
- reject(new Error('Authorization timeout'));
90
- }, 5 * 60 * 1000);
91
- });
92
- }
93
- // === Authorization URL ===
94
- export function getAuthorizationUrl(codeChallenge, clientId) {
95
- const params = new URLSearchParams({
96
- client_id: clientId || OAUTH_CLIENT_ID,
97
- redirect_uri: OAUTH_REDIRECT_URI,
98
- response_type: 'code',
99
- scope: OAUTH_SCOPES.join(' '),
100
- code_challenge: codeChallenge,
101
- code_challenge_method: 'S256',
102
- access_type: 'offline',
103
- prompt: 'consent',
104
- });
105
- return `${OAUTH_AUTH_URL}?${params.toString()}`;
106
- }
107
- async function exchangeCodeForTokens(code, codeVerifier, credentials) {
108
- const response = await fetch(OAUTH_TOKEN_URL, {
109
- method: 'POST',
110
- headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
111
- body: new URLSearchParams({
112
- client_id: credentials?.clientId || OAUTH_CLIENT_ID,
113
- client_secret: credentials?.clientSecret || OAUTH_CLIENT_SECRET,
114
- code,
115
- code_verifier: codeVerifier,
116
- grant_type: 'authorization_code',
117
- redirect_uri: OAUTH_REDIRECT_URI,
118
- }),
119
- });
120
- if (!response.ok) {
121
- const error = await response.text();
122
- throw new Error(`Token exchange failed: ${error}`);
123
- }
124
- return await response.json();
125
- }
126
- async function refreshAccessToken(refreshToken) {
127
- const response = await fetch(OAUTH_TOKEN_URL, {
128
- method: 'POST',
129
- headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
130
- body: new URLSearchParams({
131
- client_id: OAUTH_CLIENT_ID,
132
- client_secret: OAUTH_CLIENT_SECRET,
133
- refresh_token: refreshToken,
134
- grant_type: 'refresh_token',
135
- }),
136
- });
137
- if (!response.ok) {
138
- const error = await response.text();
139
- throw new Error(`Token refresh failed: ${error}`);
140
- }
141
- return await response.json();
142
- }
143
- async function getUserInfo(accessToken) {
144
- const response = await fetch(OAUTH_USERINFO_URL, {
145
- headers: { Authorization: `Bearer ${accessToken}` },
146
- });
147
- if (!response.ok) {
148
- throw new Error('Failed to get user info');
149
- }
150
- return await response.json();
151
- }
152
- // === Token Storage ===
153
- async function ensureConfigDir() {
154
- try {
155
- await fs.mkdir(CONFIG_DIR, { recursive: true });
156
- }
157
- catch {
158
- // Directory already exists
159
- }
160
- }
161
- export async function loadStoredTokens() {
162
- try {
163
- const content = await fs.readFile(TOKENS_FILE, 'utf-8');
164
- return JSON.parse(content);
165
- }
166
- catch {
167
- return null;
168
- }
169
- }
170
- async function saveTokens(tokens) {
171
- await ensureConfigDir();
172
- await fs.writeFile(TOKENS_FILE, JSON.stringify(tokens, null, 2));
173
- }
174
- export async function deleteTokens() {
175
- try {
176
- await fs.unlink(TOKENS_FILE);
177
- }
178
- catch {
179
- // File doesn't exist
180
- }
181
- }
182
- // === Login Flow ===
183
- export async function login(credentials) {
184
- const { codeVerifier, codeChallenge } = generatePKCE();
185
- const authUrl = getAuthorizationUrl(codeChallenge, credentials?.clientId);
186
- console.log('Opening browser for Google login...');
187
- // Start server first, then open browser
188
- const codePromise = startCallbackServer();
189
- await openBrowser(authUrl);
190
- console.log('Waiting for authorization...');
191
- const code = await codePromise;
192
- console.log('Exchanging code for tokens...');
193
- const tokenResponse = await exchangeCodeForTokens(code, codeVerifier, credentials);
194
- const userInfo = await getUserInfo(tokenResponse.access_token);
195
- const tokens = {
196
- accessToken: tokenResponse.access_token,
197
- refreshToken: tokenResponse.refresh_token || '',
198
- expiresAt: Date.now() + (tokenResponse.expires_in * 1000),
199
- email: userInfo.email,
200
- };
201
- await saveTokens(tokens);
202
- return tokens;
203
- }
204
- // === Auth Provider ===
205
- export class UserAuth {
206
- tokens = null;
207
- async getAccessToken() {
208
- if (!this.tokens) {
209
- this.tokens = await loadStoredTokens();
210
- }
211
- if (!this.tokens) {
212
- throw new Error('Not logged in. Run "sheets login" first.');
213
- }
214
- // Refresh if expired (with 1 minute buffer)
215
- if (Date.now() >= this.tokens.expiresAt - 60000) {
216
- if (!this.tokens.refreshToken) {
217
- throw new Error('Token expired and no refresh token. Run "sheets login" again.');
218
- }
219
- const tokenResponse = await refreshAccessToken(this.tokens.refreshToken);
220
- this.tokens.accessToken = tokenResponse.access_token;
221
- this.tokens.expiresAt = Date.now() + (tokenResponse.expires_in * 1000);
222
- if (tokenResponse.refresh_token) {
223
- this.tokens.refreshToken = tokenResponse.refresh_token;
224
- }
225
- await saveTokens(this.tokens);
226
- }
227
- return this.tokens.accessToken;
228
- }
229
- }
230
- //# sourceMappingURL=user-auth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user-auth.js","sourceRoot":"","sources":["../../src/auth/user-auth.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
@@ -1,19 +0,0 @@
1
- /**
2
- * HTTP Client for Google Sheets API
3
- * Uses native Node.js fetch (Node 18+)
4
- */
5
- export interface HttpClientOptions {
6
- getAccessToken: () => Promise<string>;
7
- }
8
- export interface RequestOptions {
9
- method?: 'GET' | 'POST' | 'PUT' | 'DELETE';
10
- body?: unknown;
11
- params?: Record<string, string>;
12
- }
13
- export declare class HttpClient {
14
- private getAccessToken;
15
- constructor(options: HttpClientOptions);
16
- request<T>(path: string, options?: RequestOptions): Promise<T>;
17
- private sleep;
18
- }
19
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,iBAAiB;IAC9B,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,cAAc;IAC3B,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC3C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,qBAAa,UAAU;IACnB,OAAO,CAAC,cAAc,CAAwB;gBAElC,OAAO,EAAE,iBAAiB;IAIhC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,CAAC,CAAC;IA6DxE,OAAO,CAAC,KAAK;CAGhB"}