@lightdash/cli 3.87.0 → 3.89.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -0
- package/dist/.tsbuildinfo.build +1 -1
- package/dist/agentConnections/agentTokenProvider.d.ts.map +1 -1
- package/dist/agentConnections/agentTokenProvider.js +9 -5
- package/dist/agentConnections/commandPolicy.d.ts.map +1 -1
- package/dist/agentConnections/commandPolicy.js +1 -0
- package/dist/agentConnections/initialToken.d.ts.map +1 -1
- package/dist/agentConnections/initialToken.js +2 -0
- package/dist/agentConnections/personalRecovery.js +1 -1
- package/dist/analytics/analytics.js +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +19 -11
- package/dist/credentials.d.ts +5 -0
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +11 -2
- package/dist/handlers/apps/createApp.d.ts.map +1 -1
- package/dist/handlers/apps/createApp.js +1 -3
- package/dist/handlers/apps/preview.d.ts.map +1 -1
- package/dist/handlers/apps/preview.js +12 -10
- package/dist/handlers/apps/previewProxy.d.ts +1 -0
- package/dist/handlers/apps/previewProxy.d.ts.map +1 -1
- package/dist/handlers/apps/previewProxy.js +70 -44
- package/dist/handlers/dbt/apiClient.d.ts.map +1 -1
- package/dist/handlers/dbt/apiClient.js +20 -12
- package/dist/handlers/diagnostics.d.ts.map +1 -1
- package/dist/handlers/diagnostics.js +2 -1
- package/dist/handlers/download.d.ts.map +1 -1
- package/dist/handlers/download.js +4 -9
- package/dist/handlers/login/pat.d.ts.map +1 -1
- package/dist/handlers/login/pat.js +2 -0
- package/dist/handlers/login.d.ts.map +1 -1
- package/dist/handlers/login.js +8 -2
- package/dist/handlers/logout.d.ts +3 -0
- package/dist/handlers/logout.d.ts.map +1 -0
- package/dist/handlers/logout.js +67 -0
- package/dist/handlers/oauthLogin.d.ts +1 -1
- package/dist/handlers/oauthLogin.d.ts.map +1 -1
- package/dist/handlers/oauthLogin.js +64 -31
- package/dist/handlers/renameHandler.d.ts.map +1 -1
- package/dist/handlers/renameHandler.js +3 -3
- package/dist/handlers/slugUpdate.d.ts.map +1 -1
- package/dist/handlers/slugUpdate.js +3 -3
- package/dist/handlers/utils.d.ts.map +1 -1
- package/dist/handlers/utils.js +1 -0
- package/dist/index.js +6 -0
- package/dist/personalLogin/fixtures.d.ts +3 -0
- package/dist/personalLogin/fixtures.d.ts.map +1 -0
- package/dist/personalLogin/fixtures.js +20 -0
- package/dist/personalLogin/instanceKey.d.ts +2 -0
- package/dist/personalLogin/instanceKey.d.ts.map +1 -0
- package/dist/personalLogin/instanceKey.js +23 -0
- package/dist/personalLogin/schema.d.ts +28 -0
- package/dist/personalLogin/schema.d.ts.map +1 -0
- package/dist/personalLogin/schema.js +69 -0
- package/dist/personalLogin/store.d.ts +24 -0
- package/dist/personalLogin/store.d.ts.map +1 -0
- package/dist/personalLogin/store.js +124 -0
- package/dist/personalLogin/tokenProvider.d.ts +31 -0
- package/dist/personalLogin/tokenProvider.d.ts.map +1 -0
- package/dist/personalLogin/tokenProvider.js +180 -0
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/handlers/download.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,WAAW,EAMX,0BAA0B,EAI1B,8BAA8B,EAa9B,6BAA6B,
|
|
1
|
+
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/handlers/download.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,WAAW,EAMX,0BAA0B,EAI1B,8BAA8B,EAa9B,6BAA6B,EAI7B,WAAW,EAIX,eAAe,EAKf,wBAAwB,EAYxB,cAAc,EAMd,KAAK,WAAW,EAGhB,KAAK,WAAW,EACnB,MAAM,mBAAmB,CAAC;AA2B3B,OAAO,EAIH,KAAK,0BAA0B,EAClC,MAAM,iCAAiC,CAAC;AA4EzC,OAAO,EACH,sBAAsB,EAGtB,cAAc,EACd,qBAAqB,EAKrB,cAAc,EACd,cAAc,EACd,8BAA8B,EAC9B,yBAAyB,EACzB,YAAY,EACZ,qBAAqB,EACrB,eAAe,EAElB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,sBAAsB,GAAG;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,uBAAuB,EAAE,OAAO,CAAC;IACjC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,uBAAuB,EAAE,OAAO,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,0BAA0B,EAAE,OAAO,CAAC;IACpC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,0BAA0B,EAAE,OAAO,CAAC;IACpC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,KAAK,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC;AA0BtC,QAAA,MAAM,sBAAsB,qDAKzB,IAAI,CACH,sBAAsB,EACtB,YAAY,GAAG,eAAe,GAAG,QAAQ,GAAG,UAAU,CACzD,KAAG,OAEoE,CAAC;AAEzE,QAAA,MAAM,iBAAiB,8KAepB,IAAI,CACH,sBAAsB,EACpB,YAAY,GACZ,QAAQ,GACR,YAAY,GACZ,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,cAAc,GACd,qBAAqB,GACrB,cAAc,GACd,qBAAqB,GACrB,WAAW,GACX,WAAW,GACX,MAAM,GACN,YAAY,CACjB,KAAG,OAgBuC,CAAC;AAO5C,QAAA,MAAM,mBAAmB,UAAW,MAAM,EAAE,KAAG,MAa9C,CAAC;AAGF,KAAK,iBAAiB,GAChB;IACI,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,WAAW,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC,GACD;IACI,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,cAAc,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC,GACD;IACI,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,eAAe,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC,CAAC;AA0CR,KAAK,aAAa,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,YAAY,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,QAAA,MAAM,wBAAwB,UACnB,WAAW,oBACA,OAAO,KAC1B,WAUY,CAAC;AAiYhB,QAAA,MAAM,iBAAiB,GACnB,CAAC,SAAS,WAAW,GAAG,eAAe,GAAG,cAAc,4IAYzD;IACC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,QAAQ,GAAG,YAAY,CAAC;IAChC,WAAW,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACvC,cAAc,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,aAAa,EACP,8BAA8B,CAAC,SAAS,CAAC,GACzC,0BAA0B,CAAC,SAAS,CAAC,GACrC,6BAA6B,CAAC,SAAS,CAAC,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,OAAO,CAAC;CAC7B,KAAG,OAAO,CAAC,aAAa,EAAE,CA4B1B,CAAC;AAEF,KAAK,mBAAmB,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,CAAC;AAkDjE,QAAA,MAAM,6BAA6B,eACnB,eAAe,EAAE,KAC9B,MAAM,EAWR,CAAC;AAEF;;;GAGG;AACH,QAAA,MAAM,8BAA8B,WAAY,WAAW,EAAE,KAAG,MAAM,EAUrE,CAAC;AAIF,QAAA,MAAM,sBAAsB,WAAY,WAAW,EAAE,KAAG,MAAM,EAM7D,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IAGnB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,aAAa,EAAE,CAAC;IACjC,MAAM,EAAE,WAAW,EAAE,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,eAAe,QACnB,MAAM,EAAE,QACP,mBAAmB,aACd,MAAM,eACJ,MAAM,eACN,MAAM,gBACN,OAAO,WACZ,OAAO,eACH,OAAO,qBACD,OAAO,eACb,OAAO,eACN,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,KACtC,OAAO,CAAC,qBAAqB,CAkK/B,CAAC;AAgEF,QAAA,MAAM,8BAA8B,UAAW,OAAO,KAAG,OACmB,CAAC;AAE7E;;;;;GAKG;AACH,QAAA,MAAM,0BAA0B,cACjB,MAAM,cACL,MAAM,EAAE,eACP,MAAM,KACpB,OAAO,CAAC,MAAM,GAAG,IAAI,CAwCvB,CAAC;AAaF,QAAA,MAAM,kBAAkB,cACT,MAAM,SACV,MAAM,EAAE,WACN,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SACxB,OAAO,aACH,OAAO,eACL,MAAM,mBACH,MAAM,EAAE,KACzB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmEhC,CAAC;AAEF,eAAO,MAAM,iCAAiC,SAAU,MAAM,KAAG,MAGzC,CAAC;AASzB;;;;;;GAMG;AACH,QAAA,MAAM,qCAAqC,UAAW,OAAO,KAAG,OAElB,CAAC;AAE/C,QAAA,MAAM,0BAA0B,UAAW,OAAO,KAAG,OAEP,CAAC;AAsF/C,QAAA,MAAM,2BAA2B,gBAChB,MAAM,KACpB,OAAO,CAAC,wBAAwB,EAAE,CAOpC,CAAC;AAEF,QAAA,MAAM,yBAAyB,cAChB,MAAM,SACV,MAAM,EAAE,WACN,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SACxB,OAAO,aACH,OAAO,eACL,MAAM,KACpB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8EhC,CAAC;AA2KF,QAAA,MAAM,gBAAgB,cACP,MAAM,OACZ,MAAM,EAAE,YACH,OAAO,eACJ,MAAM,KACpB,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,EAAE,CAAA;CAAE,CAuEvD,CAAC;AAEF,QAAA,MAAM,gBAAgB,gBACL,MAAM,KACpB,OAAO,CAAC,WAAW,EAAE,CAWvB,CAAC;AAcF,QAAA,MAAM,cAAc,cACL,MAAM,SACV,MAAM,EAAE,WACN,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SACxB,OAAO,eACD,MAAM,aACT,OAAO,KAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAyDhC,CAAC;AAkLF,eAAO,MAAM,eAAe,YACf,sBAAsB,KAChC,OAAO,CAAC,IAAI,CA4qCd,CAAC;AA8BF,QAAA,MAAM,gBAAgB,WACV,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SACvB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC9B,MAIM,CAAC;AAEV,QAAA,MAAM,sBAAsB,WAChB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SACvB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC9B;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,0BAA0B,CAAA;CAoBxD,CAAC;AAwMF;;;GAGG;AACH,QAAA,MAAM,eAAe,GAAU,CAAC,SAAS,WAAW,GAAG,eAAe,QAC5D,QAAQ,GAAG,YAAY,aAClB,MAAM,WACR,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SACxB,OAAO,SACP,MAAM,EAAE,aACJ,OAAO,eACL,MAAM,oBACD,OAAO,sBACL,OAAO,aAChB,OAAO,gBACL,MAAM,eACP,CAAC,CAAC,GAAG;IAAE,aAAa,EAAE,OAAO,CAAA;CAAE,CAAC,EAAE,eACjC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,cACvB,WAAW,CAAC,MAAM,CAAC,KAChC,OAAO,CAAC;IACP,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;CACzB,CAiMA,CAAC;AA8DF,QAAA,MAAM,2BAA2B,gEAK9B;IACC,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,eAAe,EAAE,CAAC;IAClC,cAAc,EAAE,MAAM,EAAE,CAAC;CAC5B,KAAG,MAAM,EAWT,CAAC;AAEF,QAAA,MAAM,sBAAsB,mBACR,MAAM,EAAE,eACX,MAAM,oBACF,CAAC,eAAe,GAAG;IAAE,aAAa,EAAE,OAAO,CAAA;CAAE,CAAC,EAAE,KAClE,OAAO,CAAC,MAAM,EAAE,CAId,CAAC;AAEN,QAAA,MAAM,oBAAoB,mBACN,MAAM,EAAE,eACX,MAAM,oBACF,CAAC,eAAe,GAAG;IAAE,aAAa,EAAE,OAAO,CAAA;CAAE,CAAC,EAAE,KAClE,OAAO,CAAC,MAAM,EAAE,CAId,CAAC;AAIN,QAAA,MAAM,0BAA0B,eAChB,OAAO,kBACH,MAAM,EAAE,KACzB,OAAoD,CAAC;AAExD,QAAA,MAAM,yBAAyB,gBACd,MAAM,KACpB,OAAO,CAAC,IAAI,CA6Bd,CAAC;AAoCF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,SAAU,WAAW,KAAG,WAOzD,CAAC;AAEF,eAAO,MAAM,aAAa,YACb,sBAAsB,KAChC,OAAO,CAAC,IAAI,CA4wCd,CAAC;AAEF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCvB,CAAC"}
|
|
@@ -1272,12 +1272,7 @@ const downloadHandler = async (options) => {
|
|
|
1272
1272
|
const config = await ((0, credentials_1.getAgentConnectionSelection)() === null
|
|
1273
1273
|
? (0, config_1.getConfig)()
|
|
1274
1274
|
: (0, config_1.getConfig)({ readOnly: true }));
|
|
1275
|
-
|
|
1276
|
-
await (0, credentials_1.resolveCredential)(config);
|
|
1277
|
-
}
|
|
1278
|
-
else if (!config.context?.apiKey || !config.context.serverUrl) {
|
|
1279
|
-
throw new common_1.AuthorizationError(`Not logged in. Run 'lightdash login --help'`);
|
|
1280
|
-
}
|
|
1275
|
+
await (0, credentials_1.resolveCredential)(config);
|
|
1281
1276
|
if (isOrganizationDownload) {
|
|
1282
1277
|
await (0, organizationContent_1.downloadOrganizationContent)({
|
|
1283
1278
|
customPath: options.path,
|
|
@@ -2381,9 +2376,9 @@ const uploadHandler = async (options) => {
|
|
|
2381
2376
|
const config = await ((0, credentials_1.getAgentConnectionSelection)() === null
|
|
2382
2377
|
? (0, config_1.getConfig)()
|
|
2383
2378
|
: (0, config_1.getConfig)({ readOnly: true }));
|
|
2384
|
-
|
|
2385
|
-
|
|
2386
|
-
|
|
2379
|
+
await (0, credentials_1.resolveCredential)(config);
|
|
2380
|
+
if (!config.context?.serverUrl)
|
|
2381
|
+
throw new Error("Not logged in. Run 'lightdash login --help'");
|
|
2387
2382
|
if (isOrganizationUpload) {
|
|
2388
2383
|
await (0, organizationContent_1.uploadOrganizationContent)({
|
|
2389
2384
|
customPath: contentPathOption,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pat.d.ts","sourceRoot":"","sources":["../../../src/handlers/login/pat.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pat.d.ts","sourceRoot":"","sources":["../../../src/handlers/login/pat.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,2BAA2B,YAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAC1B,MAAM,kBACI,MAAM,KACtB,OAAO,CAAC,MAAM,CA2BhB,CAAC"}
|
|
@@ -5,6 +5,7 @@ const tslib_1 = require("tslib");
|
|
|
5
5
|
const common_1 = require("@lightdash/common");
|
|
6
6
|
const node_fetch_1 = tslib_1.__importDefault(require("node-fetch"));
|
|
7
7
|
const credentials_1 = require("../../credentials");
|
|
8
|
+
const env_1 = require("../../env");
|
|
8
9
|
const generatePersonalAccessToken = async (headers, url, hoursToExpire = 720) => {
|
|
9
10
|
(0, credentials_1.refuseAgentConnection)(true);
|
|
10
11
|
const patUrl = new URL(`/api/v1/user/me/personal-access-tokens`, url).href;
|
|
@@ -21,6 +22,7 @@ const generatePersonalAccessToken = async (headers, url, hoursToExpire = 720) =>
|
|
|
21
22
|
headers: {
|
|
22
23
|
'Content-Type': 'application/json',
|
|
23
24
|
...headers,
|
|
25
|
+
'User-Agent': `lightdash-cli/${env_1.CLI_VERSION}`,
|
|
24
26
|
},
|
|
25
27
|
});
|
|
26
28
|
if (!patResponse.ok) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/handlers/login.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/handlers/login.ts"],"names":[],"mappings":"AAqBA,KAAK,YAAY,GAAG;IAChB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CACpB,CAAC;AA8CF;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,UACzB,MAAM,GAAG,SAAS,QACpB,MAAM,CAAC,UAAU,KACvB,OAGF,CAAC;AA8HF,eAAO,MAAM,KAAK,aACJ,MAAM,GAAG,SAAS,WACnB,YAAY,kBAuKxB,CAAC"}
|
package/dist/handlers/login.js
CHANGED
|
@@ -9,7 +9,9 @@ const url_1 = require("url");
|
|
|
9
9
|
const analytics_1 = require("../analytics/analytics");
|
|
10
10
|
const config_1 = require("../config");
|
|
11
11
|
const credentials_1 = require("../credentials");
|
|
12
|
+
const env_1 = require("../env");
|
|
12
13
|
const globalState_1 = tslib_1.__importDefault(require("../globalState"));
|
|
14
|
+
const store_1 = require("../personalLogin/store");
|
|
13
15
|
const styles = tslib_1.__importStar(require("../styles"));
|
|
14
16
|
const apiClient_1 = require("./dbt/apiClient");
|
|
15
17
|
const oauthLogin_1 = require("./oauthLogin");
|
|
@@ -116,6 +118,7 @@ const loginWithEmailPassword = async (url, email, password) => {
|
|
|
116
118
|
headers: {
|
|
117
119
|
'Content-Type': 'application/json',
|
|
118
120
|
Cookie: cookies,
|
|
121
|
+
'User-Agent': `lightdash-cli/${env_1.CLI_VERSION}`,
|
|
119
122
|
},
|
|
120
123
|
body: JSON.stringify({
|
|
121
124
|
description: 'Lightdash CLI',
|
|
@@ -216,7 +219,10 @@ const login = async (urlInput, options) => {
|
|
|
216
219
|
else {
|
|
217
220
|
loginResult = await (0, oauthLogin_1.loginWithOauth)(url, options.oauthPort);
|
|
218
221
|
}
|
|
219
|
-
const { userUuid,
|
|
222
|
+
const { userUuid, organizationUuid } = loginResult;
|
|
223
|
+
const token = 'token' in loginResult ? loginResult.token : undefined;
|
|
224
|
+
if (token !== undefined)
|
|
225
|
+
await new store_1.PersonalLoginStore().remove(url);
|
|
220
226
|
globalState_1.default.debug(`> Logged in with userUuid: ${userUuid}`);
|
|
221
227
|
await analytics_1.LightdashAnalytics.track({
|
|
222
228
|
event: 'login.completed',
|
|
@@ -229,7 +235,7 @@ const login = async (urlInput, options) => {
|
|
|
229
235
|
});
|
|
230
236
|
await (0, config_1.setContext)({
|
|
231
237
|
serverUrl: url,
|
|
232
|
-
apiKey: token,
|
|
238
|
+
...(token === undefined ? {} : { apiKey: token }),
|
|
233
239
|
});
|
|
234
240
|
await analytics_1.LightdashAnalytics.identify({ organizationId: organizationUuid });
|
|
235
241
|
globalState_1.default.debug(`> Saved config on: ${config_1.configFilePath}`);
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const logoutUnreachable = "The server could not confirm logout. The server-side session will remain until it expires. Your local login was kept so you can retry `lightdash logout`.";
|
|
2
|
+
export declare const logout: () => Promise<void>;
|
|
3
|
+
//# sourceMappingURL=logout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/handlers/logout.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,iBAAiB,8JACiI,CAAC;AAChK,eAAO,MAAM,MAAM,QAAa,OAAO,CAAC,IAAI,CA6D3C,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.logout = exports.logoutUnreachable = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const node_fetch_1 = tslib_1.__importDefault(require("node-fetch"));
|
|
6
|
+
const stream_1 = require("stream");
|
|
7
|
+
const config_1 = require("../config");
|
|
8
|
+
const credentials_1 = require("../credentials");
|
|
9
|
+
const instanceKey_1 = require("../personalLogin/instanceKey");
|
|
10
|
+
const store_1 = require("../personalLogin/store");
|
|
11
|
+
const tokenProvider_1 = require("../personalLogin/tokenProvider");
|
|
12
|
+
exports.logoutUnreachable = 'The server could not confirm logout. The server-side session will remain until it expires. Your local login was kept so you can retry `lightdash logout`.';
|
|
13
|
+
const logout = async () => {
|
|
14
|
+
(0, credentials_1.refuseAgentConnection)(true);
|
|
15
|
+
const config = await (0, config_1.getConfig)();
|
|
16
|
+
const rawConfig = await (0, config_1.getRawConfig)();
|
|
17
|
+
const savedKey = rawConfig.context?.apiKey;
|
|
18
|
+
const environmentKey = process.env.LIGHTDASH_API_KEY;
|
|
19
|
+
const environmentOverride = !!environmentKey && config.context?.apiKey === environmentKey;
|
|
20
|
+
if (!config.context?.serverUrl)
|
|
21
|
+
throw new Error("Not logged in. Run 'lightdash login --help'");
|
|
22
|
+
const instance = (0, instanceKey_1.personalInstanceKey)(config.context.serverUrl);
|
|
23
|
+
const personal = await new store_1.PersonalLoginStore().withLock(async (locked) => {
|
|
24
|
+
const login = await locked.read(instance);
|
|
25
|
+
if (login === null)
|
|
26
|
+
return false;
|
|
27
|
+
const revoke = async (token, hint) => {
|
|
28
|
+
try {
|
|
29
|
+
const response = await (0, node_fetch_1.default)(`${instance}/api/v1/oauth/revoke`, {
|
|
30
|
+
method: 'POST',
|
|
31
|
+
headers: (0, tokenProvider_1.oauthHeaders)(),
|
|
32
|
+
redirect: 'error',
|
|
33
|
+
signal: AbortSignal.timeout(15_000),
|
|
34
|
+
body: new URLSearchParams({
|
|
35
|
+
token,
|
|
36
|
+
token_type_hint: hint,
|
|
37
|
+
client_id: 'lightdash-cli',
|
|
38
|
+
}),
|
|
39
|
+
});
|
|
40
|
+
if (!response.ok &&
|
|
41
|
+
(response.status < 400 || response.status >= 500))
|
|
42
|
+
throw new Error(exports.logoutUnreachable);
|
|
43
|
+
if (response.body instanceof stream_1.Readable)
|
|
44
|
+
response.body.destroy();
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
throw new Error(exports.logoutUnreachable);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
await revoke(login.tokens.refreshToken, 'refresh_token');
|
|
51
|
+
await revoke(login.tokens.accessToken, 'access_token');
|
|
52
|
+
await locked.remove(instance);
|
|
53
|
+
await locked.clearJournal(instance);
|
|
54
|
+
return true;
|
|
55
|
+
});
|
|
56
|
+
if (!personal && !savedKey && !environmentOverride)
|
|
57
|
+
throw new Error("Not logged in. Run 'lightdash login --help'");
|
|
58
|
+
await (0, config_1.unsetApiKey)();
|
|
59
|
+
if (savedKey)
|
|
60
|
+
console.error('The saved API key was removed. A personal access token is not revoked by logout.');
|
|
61
|
+
if (environmentOverride) {
|
|
62
|
+
console.error('LIGHTDASH_API_KEY is set in the environment and stays active until unset.');
|
|
63
|
+
}
|
|
64
|
+
else
|
|
65
|
+
console.error(`Logged out of ${instance}`);
|
|
66
|
+
};
|
|
67
|
+
exports.logout = logout;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauthLogin.d.ts","sourceRoot":"","sources":["../../src/handlers/oauthLogin.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"oauthLogin.d.ts","sourceRoot":"","sources":["../../src/handlers/oauthLogin.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,cAAc,QAClB,MAAM,cACC,MAAM,KACnB,OAAO,CAAC;IACP,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,gBAAgB,CAAC;CAChC,CAmRA,CAAC"}
|
|
@@ -7,13 +7,17 @@ const http = tslib_1.__importStar(require("http"));
|
|
|
7
7
|
const node_fetch_1 = tslib_1.__importDefault(require("node-fetch"));
|
|
8
8
|
const openid_client_1 = require("openid-client");
|
|
9
9
|
const url_1 = require("url");
|
|
10
|
+
const uuid_1 = require("uuid");
|
|
10
11
|
const credentials_1 = require("../credentials");
|
|
11
12
|
const globalState_1 = tslib_1.__importDefault(require("../globalState"));
|
|
13
|
+
const instanceKey_1 = require("../personalLogin/instanceKey");
|
|
14
|
+
const store_1 = require("../personalLogin/store");
|
|
15
|
+
const tokenProvider_1 = require("../personalLogin/tokenProvider");
|
|
12
16
|
const styles = tslib_1.__importStar(require("../styles"));
|
|
13
17
|
const oauth_1 = require("./login/oauth");
|
|
14
|
-
const pat_1 = require("./login/pat");
|
|
15
18
|
const loginWithOauth = async (url, oauthPort) => {
|
|
16
19
|
(0, credentials_1.refuseAgentConnection)(true);
|
|
20
|
+
const instanceUrl = (0, instanceKey_1.personalInstanceKey)(url);
|
|
17
21
|
// Create a promise that will be resolved when we get the authorization code
|
|
18
22
|
let resolveAuth;
|
|
19
23
|
let rejectAuth;
|
|
@@ -103,11 +107,12 @@ const loginWithOauth = async (url, oauthPort) => {
|
|
|
103
107
|
const redirectUri = `http://localhost:${port}/callback`;
|
|
104
108
|
globalState_1.default.debug(`> Starting CLI callback server on URI: ${redirectUri}`);
|
|
105
109
|
// Create OAuth2 issuer and client using openid-client
|
|
106
|
-
const issuerUrl = new url_1.URL(
|
|
110
|
+
const issuerUrl = new url_1.URL(`${instanceUrl}/api/v1/oauth`).href;
|
|
107
111
|
const issuer = new openid_client_1.Issuer({
|
|
108
112
|
issuer: issuerUrl,
|
|
109
|
-
authorization_endpoint: new url_1.URL(
|
|
110
|
-
|
|
113
|
+
authorization_endpoint: new url_1.URL(`${instanceUrl}/api/v1/oauth/authorize`)
|
|
114
|
+
.href,
|
|
115
|
+
token_endpoint: new url_1.URL(`${instanceUrl}/api/v1/oauth/token`).href,
|
|
111
116
|
});
|
|
112
117
|
const client = new issuer.Client({
|
|
113
118
|
client_id: 'lightdash-cli',
|
|
@@ -135,12 +140,13 @@ const loginWithOauth = async (url, oauthPort) => {
|
|
|
135
140
|
globalState_1.default.debug(`> Got authorization code`);
|
|
136
141
|
globalState_1.default.debug(`> Getting token for authorization code`);
|
|
137
142
|
// Exchange the authorization code for an access token manually (pure OAuth2)
|
|
138
|
-
const tokenUrl = new url_1.URL(
|
|
143
|
+
const tokenUrl = new url_1.URL(`${instanceUrl}/api/v1/oauth/token`);
|
|
144
|
+
const startedAt = Date.now();
|
|
139
145
|
const tokenResponse = await (0, node_fetch_1.default)(tokenUrl.href, {
|
|
140
146
|
method: 'POST',
|
|
141
|
-
headers:
|
|
142
|
-
|
|
143
|
-
|
|
147
|
+
headers: (0, tokenProvider_1.oauthHeaders)(),
|
|
148
|
+
redirect: 'error',
|
|
149
|
+
signal: AbortSignal.timeout(15_000),
|
|
144
150
|
body: new URLSearchParams({
|
|
145
151
|
grant_type: 'authorization_code',
|
|
146
152
|
code,
|
|
@@ -150,40 +156,67 @@ const loginWithOauth = async (url, oauthPort) => {
|
|
|
150
156
|
}),
|
|
151
157
|
});
|
|
152
158
|
if (!tokenResponse.ok) {
|
|
153
|
-
|
|
154
|
-
throw new common_1.AuthorizationError(`Token exchange failed: ${tokenResponse.status} ${errorText}`);
|
|
159
|
+
throw new common_1.AuthorizationError(`Token exchange failed: ${tokenResponse.status}`);
|
|
155
160
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
throw new common_1.AuthorizationError('No access token received from OAuth server');
|
|
161
|
+
let tokenData;
|
|
162
|
+
try {
|
|
163
|
+
tokenData = await tokenResponse.json();
|
|
160
164
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
const
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
globalState_1.default.debug(`> Got PAT`);
|
|
168
|
-
// Get user information using the PAT
|
|
169
|
-
const userInfoUrl = new url_1.URL('/api/v1/user', url);
|
|
165
|
+
catch {
|
|
166
|
+
throw new common_1.AuthorizationError('The server returned an invalid token response. No login was saved.');
|
|
167
|
+
}
|
|
168
|
+
const token = (0, tokenProvider_1.parseTokenResponse)(tokenData);
|
|
169
|
+
const expiry = (0, tokenProvider_1.tokenExpiry)(token, startedAt, tokenResponse.headers.get('date'), null);
|
|
170
|
+
const userInfoUrl = new url_1.URL(`${instanceUrl}/api/v1/user`);
|
|
170
171
|
const userResponse = await (0, node_fetch_1.default)(userInfoUrl.href, {
|
|
171
172
|
method: 'GET',
|
|
173
|
+
redirect: 'error',
|
|
174
|
+
signal: AbortSignal.timeout(15_000),
|
|
172
175
|
headers: {
|
|
173
|
-
Authorization: `
|
|
176
|
+
Authorization: `Bearer ${token.access_token}`,
|
|
174
177
|
},
|
|
175
178
|
});
|
|
176
179
|
if (!userResponse.ok) {
|
|
177
180
|
throw new common_1.AuthorizationError(`Failed to get user info: ${userResponse.status}`);
|
|
178
181
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
182
|
+
let userData;
|
|
183
|
+
try {
|
|
184
|
+
userData = await userResponse.json();
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
throw new common_1.AuthorizationError('The server returned invalid user information. No login was saved.');
|
|
188
|
+
}
|
|
189
|
+
if (typeof userData !== 'object' ||
|
|
190
|
+
userData === null ||
|
|
191
|
+
!('results' in userData) ||
|
|
192
|
+
typeof userData.results !== 'object' ||
|
|
193
|
+
userData.results === null ||
|
|
194
|
+
!('userUuid' in userData.results) ||
|
|
195
|
+
typeof userData.results.userUuid !== 'string' ||
|
|
196
|
+
!(0, uuid_1.validate)(userData.results.userUuid) ||
|
|
197
|
+
!('organizationUuid' in userData.results) ||
|
|
198
|
+
typeof userData.results.organizationUuid !== 'string' ||
|
|
199
|
+
!(0, uuid_1.validate)(userData.results.organizationUuid))
|
|
200
|
+
throw new common_1.AuthorizationError('The server returned invalid user information. No login was saved.');
|
|
201
|
+
const { userUuid, organizationUuid } = userData.results;
|
|
202
|
+
globalState_1.default.debug(`> Got user info: ${userUuid} in organization ${organizationUuid}`);
|
|
203
|
+
await new store_1.PersonalLoginStore().save(instanceUrl, {
|
|
204
|
+
clientId: 'lightdash-cli',
|
|
205
|
+
personUuid: userUuid,
|
|
184
206
|
organizationUuid,
|
|
185
|
-
|
|
186
|
-
|
|
207
|
+
tokens: {
|
|
208
|
+
accessToken: token.access_token,
|
|
209
|
+
refreshToken: token.refresh_token,
|
|
210
|
+
accessTokenIssuedAt: expiry.accessTokenIssuedAt,
|
|
211
|
+
accessTokenExpiresAt: expiry.accessTokenExpiresAt,
|
|
212
|
+
scopes: token.scope.split(' '),
|
|
213
|
+
generation: 1,
|
|
214
|
+
lastRefreshAttemptUuid: null,
|
|
215
|
+
},
|
|
216
|
+
sessionExpiresAt: expiry.sessionExpiresAt,
|
|
217
|
+
refreshState: { kind: 'idle' },
|
|
218
|
+
});
|
|
219
|
+
return { userUuid, organizationUuid, credential: 'personal_oauth' };
|
|
187
220
|
}
|
|
188
221
|
finally {
|
|
189
222
|
// Clean up the server
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renameHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/renameHandler.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"renameHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/renameHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,UAAU,EAEb,MAAM,mBAAmB,CAAC;AAoB3B,KAAK,oBAAoB,GAAG;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;CACrB,CAAC;AAwCF,eAAO,MAAM,aAAa,YAAmB,oBAAoB,kBAuNhE,CAAC"}
|
|
@@ -44,9 +44,9 @@ const renameHandler = async (options) => {
|
|
|
44
44
|
const executionId = (0, uuid_1.v4)();
|
|
45
45
|
const startTime = Date.now();
|
|
46
46
|
const config = await (0, config_1.getConfig)();
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
await (0, credentials_1.resolveCredential)(config);
|
|
48
|
+
if (!config.context?.serverUrl)
|
|
49
|
+
throw new Error("Not logged in. Run 'lightdash login --help'");
|
|
50
50
|
const overrideProjectUuid = await (0, selectProject_1.resolveProjectOverride)(config, options.project);
|
|
51
51
|
const projectUuid = overrideProjectUuid ||
|
|
52
52
|
config.context.previewProject ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slugUpdate.d.ts","sourceRoot":"","sources":["../../src/handlers/slugUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"slugUpdate.d.ts","sourceRoot":"","sources":["../../src/handlers/slugUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,WAAW,EAKX,KAAK,wBAAwB,EAChC,MAAM,mBAAmB,CAAC;AAa3B,KAAK,iBAAiB,GAAG;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACvB,WAAW,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,SAAS,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,QAAQ,EACF;QACI,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,EAAE,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC;QACxD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACjC,GACD,SAAS,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;CAC7B,CAAC;AAIF,MAAM,MAAM,yBAAyB,GAAG;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAyFF,eAAO,MAAM,mBAAmB,eAChB,MAAM,GAAG,SAAS,QACxB,MAAM,MACR,MAAM,iBACI,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,SAAS,KACxD,OAAO,CAAC,mBAAmB,CA2L7B,CAAC;AAEF,eAAO,MAAM,6BAA6B,SAChC,mBAAmB,cACb,MAAM,GAAG,SAAS,KAC/B,yBAAyB,EAuB3B,CAAC;AAuDF,eAAO,MAAM,oBAAoB,SACvB,mBAAmB,KAC1B,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAuD7B,CAAC;AAEF,eAAO,MAAM,iBAAiB,gBACb,MAAM,WACV,wBAAwB,KAClC,OAAO,CAAC,IAAI,CAmBd,CAAC;AAEF,eAAO,MAAM,iBAAiB,gBACb,MAAM,cACP,MAAM,GAAG,SAAS,QACxB,MAAM,MACR,MAAM,iBACI,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,SAAS,KACxD,OAAO,CAAC,mBAAmB,CAuB7B,CAAC;AAEF,eAAO,MAAM,iBAAiB,YACjB,iBAAiB,KAC3B,OAAO,CAAC,IAAI,CAuDd,CAAC"}
|
|
@@ -342,9 +342,9 @@ const slugUpdateHandler = async (options) => {
|
|
|
342
342
|
globalState_1.default.setVerbose(options.verbose);
|
|
343
343
|
await (0, apiClient_1.checkLightdashVersion)();
|
|
344
344
|
const config = await (0, config_1.getConfig)();
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
345
|
+
await (0, credentials_1.resolveCredential)(config);
|
|
346
|
+
if (!config.context?.serverUrl)
|
|
347
|
+
throw new Error("Not logged in. Run 'lightdash login --help'");
|
|
348
348
|
const selection = await (0, selectProject_1.selectProject)(config, options.project);
|
|
349
349
|
if (!selection) {
|
|
350
350
|
throw new common_1.ParameterError('No project selected. Run lightdash config set-project');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/handlers/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,yBAAyB,EACzB,4BAA4B,EAC5B,aAAa,EAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAGH,KAAK,UAAU,EAClB,MAAM,gBAAgB,CAAC;AAQxB,KAAK,aAAa,GAAG;IACjB,cAAc,EAAE,kBAAkB,CAAC;IACnC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,CAAC,4BAA4B,CAAC,EAAE,aAAa,CAAC;IAC9C,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACvC,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/handlers/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,yBAAyB,EACzB,4BAA4B,EAC5B,aAAa,EAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAGH,KAAK,UAAU,EAClB,MAAM,gBAAgB,CAAC;AAQxB,KAAK,aAAa,GAAG;IACjB,cAAc,EAAE,kBAAkB,CAAC;IACnC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,CAAC,4BAA4B,CAAC,EAAE,aAAa,CAAC;IAC9C,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACvC,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAYtE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,UAM1C;AAqBD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,iBAiBhD;AAED,wBAAgB,sBAAsB,CAClC,UAAU,EAAE,UAAU,EACtB,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAClC,aAAa,CAOf"}
|
package/dist/handlers/utils.js
CHANGED
|
@@ -17,6 +17,7 @@ function getCredentialAuthHeader(credential) {
|
|
|
17
17
|
switch (credential.kind) {
|
|
18
18
|
case 'human_api_key':
|
|
19
19
|
return `${TokenType.ApiKey} ${credential.token}`;
|
|
20
|
+
case 'personal_oauth':
|
|
20
21
|
case 'service_account':
|
|
21
22
|
case 'agent_connection':
|
|
22
23
|
return `${TokenType.Bearer} ${credential.token}`;
|
package/dist/index.js
CHANGED
|
@@ -31,6 +31,7 @@ const installSkills_1 = require("./handlers/installSkills");
|
|
|
31
31
|
const lint_1 = require("./handlers/lint");
|
|
32
32
|
const listProjects_1 = require("./handlers/listProjects");
|
|
33
33
|
const login_1 = require("./handlers/login");
|
|
34
|
+
const logout_1 = require("./handlers/logout");
|
|
34
35
|
const preAggregateAudit_1 = require("./handlers/preAggregateAudit");
|
|
35
36
|
const preAggregateCheckExternal_1 = require("./handlers/preAggregateCheckExternal");
|
|
36
37
|
const preview_2 = require("./handlers/preview");
|
|
@@ -167,6 +168,11 @@ ${styles.bold('Examples:')}
|
|
|
167
168
|
.option('--oauth-port <port>', 'Port for the local OAuth callback server (default: random available port)', parseOAuthPortArgument, undefined)
|
|
168
169
|
.option('--verbose', undefined, false)
|
|
169
170
|
.action(login_1.login);
|
|
171
|
+
commander_1.program
|
|
172
|
+
.command('logout')
|
|
173
|
+
.description('Logs out of the configured instance and revokes a browser login session')
|
|
174
|
+
.addHelpText('after', '\nBrowser login sessions are revoked on the server. Saved API keys are removed locally; personal access tokens must be revoked in your account settings.\n')
|
|
175
|
+
.action(logout_1.logout);
|
|
170
176
|
const agentProgram = commander_1.program
|
|
171
177
|
.command('agent')
|
|
172
178
|
.description('Connect your agent to the warehouse and check its status');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/personalLogin/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,eAAO,MAAM,YAAY,QAAO,aAe9B,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loginFixture = void 0;
|
|
4
|
+
const loginFixture = () => ({
|
|
5
|
+
clientId: 'lightdash-cli',
|
|
6
|
+
personUuid: '22222222-2222-4222-8222-222222222222',
|
|
7
|
+
organizationUuid: '11111111-1111-4111-8111-111111111111',
|
|
8
|
+
tokens: {
|
|
9
|
+
accessToken: 'personal-access',
|
|
10
|
+
accessTokenIssuedAt: new Date(Date.now() - 1000).toISOString(),
|
|
11
|
+
accessTokenExpiresAt: new Date(Date.now() + 3_600_000).toISOString(),
|
|
12
|
+
refreshToken: 'personal-refresh',
|
|
13
|
+
scopes: ['read', 'write'],
|
|
14
|
+
generation: 1,
|
|
15
|
+
lastRefreshAttemptUuid: null,
|
|
16
|
+
},
|
|
17
|
+
sessionExpiresAt: new Date(Date.now() + 8 * 3_600_000).toISOString(),
|
|
18
|
+
refreshState: { kind: 'idle' },
|
|
19
|
+
});
|
|
20
|
+
exports.loginFixture = loginFixture;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instanceKey.d.ts","sourceRoot":"","sources":["../../src/personalLogin/instanceKey.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,UAAW,MAAM,KAAG,MAmBnD,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.personalInstanceKey = void 0;
|
|
4
|
+
const personalInstanceKey = (value) => {
|
|
5
|
+
try {
|
|
6
|
+
const url = new URL(value);
|
|
7
|
+
if (!/^https?:\/\/[^/?#\\\s@]+\/?$/i.test(value) ||
|
|
8
|
+
!['http:', 'https:'].includes(url.protocol) ||
|
|
9
|
+
url.username !== '' ||
|
|
10
|
+
url.password !== '' ||
|
|
11
|
+
url.pathname !== '/' ||
|
|
12
|
+
url.search !== '' ||
|
|
13
|
+
url.hash !== '' ||
|
|
14
|
+
value.includes('?') ||
|
|
15
|
+
value.includes('#'))
|
|
16
|
+
throw new Error();
|
|
17
|
+
return url.origin;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
throw new Error('Invalid personal login instance URL.');
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
exports.personalInstanceKey = personalInstanceKey;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type PersonalLogin = {
|
|
2
|
+
clientId: 'lightdash-cli';
|
|
3
|
+
personUuid: string;
|
|
4
|
+
organizationUuid: string;
|
|
5
|
+
tokens: {
|
|
6
|
+
accessToken: string;
|
|
7
|
+
accessTokenIssuedAt: string;
|
|
8
|
+
accessTokenExpiresAt: string;
|
|
9
|
+
refreshToken: string;
|
|
10
|
+
scopes: string[];
|
|
11
|
+
generation: number;
|
|
12
|
+
lastRefreshAttemptUuid: string | null;
|
|
13
|
+
};
|
|
14
|
+
sessionExpiresAt: string;
|
|
15
|
+
refreshState: {
|
|
16
|
+
kind: 'idle';
|
|
17
|
+
} | {
|
|
18
|
+
kind: 'in_progress';
|
|
19
|
+
attemptUuid: string;
|
|
20
|
+
startedAt: string;
|
|
21
|
+
} | {
|
|
22
|
+
kind: 'login_required';
|
|
23
|
+
since: string;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
export declare const invalidLogin: () => Error;
|
|
27
|
+
export declare const validatePersonalLogin: (value: unknown) => PersonalLogin;
|
|
28
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/personalLogin/schema.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG;IACxB,QAAQ,EAAE,eAAe,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE;QACJ,WAAW,EAAE,MAAM,CAAC;QACpB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,oBAAoB,EAAE,MAAM,CAAC;QAC7B,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;KACzC,CAAC;IACF,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EACN;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAChB;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAC/D;QAAE,IAAI,EAAE,gBAAgB,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD,CAAC;AACF,eAAO,MAAM,YAAY,QAAO,KAC0C,CAAC;AAsD3E,eAAO,MAAM,qBAAqB,UAAW,OAAO,KAAG,aAUtD,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validatePersonalLogin = exports.invalidLogin = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const ajv_1 = tslib_1.__importDefault(require("ajv"));
|
|
6
|
+
const ajv_formats_1 = tslib_1.__importDefault(require("ajv-formats"));
|
|
7
|
+
const invalidLogin = () => new Error('Invalid personal login data. Run `lightdash login` again.');
|
|
8
|
+
exports.invalidLogin = invalidLogin;
|
|
9
|
+
const text = { type: 'string', minLength: 1, maxLength: 16384 };
|
|
10
|
+
const uuid = { type: 'string', format: 'uuid' };
|
|
11
|
+
const date = {
|
|
12
|
+
type: 'string',
|
|
13
|
+
format: 'date-time',
|
|
14
|
+
pattern: '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:[0-5]\\d\\.\\d{3}Z$',
|
|
15
|
+
};
|
|
16
|
+
const object = (properties) => ({
|
|
17
|
+
type: 'object',
|
|
18
|
+
additionalProperties: false,
|
|
19
|
+
properties,
|
|
20
|
+
required: Object.keys(properties),
|
|
21
|
+
});
|
|
22
|
+
const ajv = new ajv_1.default();
|
|
23
|
+
(0, ajv_formats_1.default)(ajv);
|
|
24
|
+
const validate = ajv.compile(object({
|
|
25
|
+
clientId: { const: 'lightdash-cli' },
|
|
26
|
+
personUuid: uuid,
|
|
27
|
+
organizationUuid: uuid,
|
|
28
|
+
tokens: object({
|
|
29
|
+
accessToken: text,
|
|
30
|
+
accessTokenIssuedAt: date,
|
|
31
|
+
accessTokenExpiresAt: date,
|
|
32
|
+
refreshToken: text,
|
|
33
|
+
scopes: {
|
|
34
|
+
type: 'array',
|
|
35
|
+
items: { enum: ['read', 'write'] },
|
|
36
|
+
minItems: 2,
|
|
37
|
+
maxItems: 2,
|
|
38
|
+
uniqueItems: true,
|
|
39
|
+
},
|
|
40
|
+
generation: {
|
|
41
|
+
type: 'integer',
|
|
42
|
+
minimum: 1,
|
|
43
|
+
maximum: Number.MAX_SAFE_INTEGER,
|
|
44
|
+
},
|
|
45
|
+
lastRefreshAttemptUuid: { anyOf: [uuid, { type: 'null' }] },
|
|
46
|
+
}),
|
|
47
|
+
sessionExpiresAt: date,
|
|
48
|
+
refreshState: {
|
|
49
|
+
oneOf: [
|
|
50
|
+
object({ kind: { const: 'idle' } }),
|
|
51
|
+
object({
|
|
52
|
+
kind: { const: 'in_progress' },
|
|
53
|
+
attemptUuid: uuid,
|
|
54
|
+
startedAt: date,
|
|
55
|
+
}),
|
|
56
|
+
object({ kind: { const: 'login_required' }, since: date }),
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
}));
|
|
60
|
+
const validatePersonalLogin = (value) => {
|
|
61
|
+
if (!validate(value) ||
|
|
62
|
+
Date.parse(value.tokens.accessTokenExpiresAt) >
|
|
63
|
+
Date.parse(value.sessionExpiresAt) ||
|
|
64
|
+
Date.parse(value.tokens.accessTokenIssuedAt) >=
|
|
65
|
+
Date.parse(value.tokens.accessTokenExpiresAt))
|
|
66
|
+
throw (0, exports.invalidLogin)();
|
|
67
|
+
return value;
|
|
68
|
+
};
|
|
69
|
+
exports.validatePersonalLogin = validatePersonalLogin;
|