@credibledata/cred-cli 0.0.103 → 0.0.105
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 +106 -1
- package/dist/agent-contract.spec.js +548 -0
- package/dist/agent-contract.spec.js.map +1 -0
- package/dist/browser.js +72 -0
- package/dist/browser.js.map +1 -0
- package/dist/browser.spec.js +125 -0
- package/dist/browser.spec.js.map +1 -0
- package/dist/client/api.js +4137 -1159
- package/dist/client/api.js.map +1 -1
- package/dist/client-codeassist/api.js +476 -0
- package/dist/client-codeassist/api.js.map +1 -0
- package/dist/client-codeassist/base.js +69 -0
- package/dist/client-codeassist/base.js.map +1 -0
- package/dist/client-codeassist/common.js +162 -0
- package/dist/client-codeassist/common.js.map +1 -0
- package/dist/client-codeassist/configuration.js +44 -0
- package/dist/client-codeassist/configuration.js.map +1 -0
- package/dist/client-codeassist/index.js +32 -0
- package/dist/client-codeassist/index.js.map +1 -0
- package/dist/clientconfiguration.js +17 -289
- package/dist/clientconfiguration.js.map +1 -1
- package/dist/clientconfiguration.spec.js +35 -96
- package/dist/clientconfiguration.spec.js.map +1 -1
- package/dist/commands/add.js +103 -3
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/add.spec.js +113 -0
- package/dist/commands/add.spec.js.map +1 -0
- package/dist/commands/connection/createconnections.js +104 -7
- package/dist/commands/connection/createconnections.js.map +1 -1
- package/dist/commands/connection/createconnections.spec.js +35 -1
- package/dist/commands/connection/createconnections.spec.js.map +1 -1
- package/dist/commands/connection/deleteconnection.js +4 -2
- package/dist/commands/connection/deleteconnection.js.map +1 -1
- package/dist/commands/connection/deleteconnection.spec.js +6 -1
- package/dist/commands/connection/deleteconnection.spec.js.map +1 -1
- package/dist/commands/connection/listconnections.js +2 -0
- package/dist/commands/connection/listconnections.js.map +1 -1
- package/dist/commands/connection/updateconnection.js +365 -0
- package/dist/commands/connection/updateconnection.js.map +1 -0
- package/dist/commands/connection/updateconnection.spec.js +625 -0
- package/dist/commands/connection/updateconnection.spec.js.map +1 -0
- package/dist/commands/database/createdatabase.js +52 -0
- package/dist/commands/database/createdatabase.js.map +1 -0
- package/dist/commands/database/database.spec.js +267 -0
- package/dist/commands/database/database.spec.js.map +1 -0
- package/dist/commands/database/deletedatabase.js +91 -0
- package/dist/commands/database/deletedatabase.js.map +1 -0
- package/dist/commands/database/getdatabase.js +97 -0
- package/dist/commands/database/getdatabase.js.map +1 -0
- package/dist/commands/database/listdatabases.js +36 -0
- package/dist/commands/database/listdatabases.js.map +1 -0
- package/dist/commands/database/shared.js +125 -0
- package/dist/commands/database/shared.js.map +1 -0
- package/dist/commands/database/shared.spec.js +109 -0
- package/dist/commands/database/shared.spec.js.map +1 -0
- package/dist/commands/database/updatedatabase.js +39 -0
- package/dist/commands/database/updatedatabase.js.map +1 -0
- package/dist/commands/environment/createenvironment.js +59 -28
- package/dist/commands/environment/createenvironment.js.map +1 -1
- package/dist/commands/environment/createenvironment.spec.js +29 -0
- package/dist/commands/environment/createenvironment.spec.js.map +1 -1
- package/dist/commands/environment/deleteenvironment.js +3 -2
- package/dist/commands/environment/deleteenvironment.js.map +1 -1
- package/dist/commands/environment/deleteenvironment.spec.js +5 -1
- package/dist/commands/environment/deleteenvironment.spec.js.map +1 -1
- package/dist/commands/environment/getenvironment.js +1 -0
- package/dist/commands/environment/getenvironment.js.map +1 -1
- package/dist/commands/environment/listenvironments.js +40 -8
- package/dist/commands/environment/listenvironments.js.map +1 -1
- package/dist/commands/environment/listenvironments.spec.js +41 -2
- package/dist/commands/environment/listenvironments.spec.js.map +1 -1
- package/dist/commands/environment/setenvironment.js +145 -6
- package/dist/commands/environment/setenvironment.js.map +1 -1
- package/dist/commands/environment/setenvironment.spec.js +256 -8
- package/dist/commands/environment/setenvironment.spec.js.map +1 -1
- package/dist/commands/environment/updateenvironment.js +12 -8
- package/dist/commands/environment/updateenvironment.js.map +1 -1
- package/dist/commands/environment/updateenvironment.spec.js +36 -2
- package/dist/commands/environment/updateenvironment.spec.js.map +1 -1
- package/dist/commands/get.js +64 -1
- package/dist/commands/get.js.map +1 -1
- package/dist/commands/group/addmember.js +3 -1
- package/dist/commands/group/addmember.js.map +1 -1
- package/dist/commands/group/addmember.spec.js +7 -2
- package/dist/commands/group/addmember.spec.js.map +1 -1
- package/dist/commands/group/creategroup.js +2 -0
- package/dist/commands/group/creategroup.js.map +1 -1
- package/dist/commands/group/deletegroup.js +3 -1
- package/dist/commands/group/deletegroup.js.map +1 -1
- package/dist/commands/group/deletegroup.spec.js +7 -1
- package/dist/commands/group/deletegroup.spec.js.map +1 -1
- package/dist/commands/group/getgroup.js +2 -0
- package/dist/commands/group/getgroup.js.map +1 -1
- package/dist/commands/group/listgroups.js +2 -0
- package/dist/commands/group/listgroups.js.map +1 -1
- package/dist/commands/group/removemember.js +3 -1
- package/dist/commands/group/removemember.js.map +1 -1
- package/dist/commands/group/removemember.spec.js +7 -2
- package/dist/commands/group/removemember.spec.js.map +1 -1
- package/dist/commands/groupaccesstoken/deleteToken.js +2 -1
- package/dist/commands/groupaccesstoken/deleteToken.js.map +1 -1
- package/dist/commands/groupaccesstoken/groupContainer.js +2 -0
- package/dist/commands/groupaccesstoken/groupContainer.js.map +1 -1
- package/dist/commands/list.js +24 -4
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/materialization/cancelrun.js +3 -1
- package/dist/commands/materialization/cancelrun.js.map +1 -1
- package/dist/commands/materialization/getindex.js +2 -0
- package/dist/commands/materialization/getindex.js.map +1 -1
- package/dist/commands/materialization/getmaterialization.js +2 -0
- package/dist/commands/materialization/getmaterialization.js.map +1 -1
- package/dist/commands/materialization/getpreaggregate.js +2 -0
- package/dist/commands/materialization/getpreaggregate.js.map +1 -1
- package/dist/commands/materialization/getrun.js +2 -0
- package/dist/commands/materialization/getrun.js.map +1 -1
- package/dist/commands/materialization/listindexes.js +2 -0
- package/dist/commands/materialization/listindexes.js.map +1 -1
- package/dist/commands/materialization/listmaterializations.js +2 -0
- package/dist/commands/materialization/listmaterializations.js.map +1 -1
- package/dist/commands/materialization/listpreaggregates.js +2 -0
- package/dist/commands/materialization/listpreaggregates.js.map +1 -1
- package/dist/commands/materialization/listruns.js +3 -1
- package/dist/commands/materialization/listruns.js.map +1 -1
- package/dist/commands/materialization/rerun.js +3 -1
- package/dist/commands/materialization/rerun.js.map +1 -1
- package/dist/commands/misc/inquirerHost.js +87 -0
- package/dist/commands/misc/inquirerHost.js.map +1 -0
- package/dist/commands/misc/inquirerHost.spec.js +91 -0
- package/dist/commands/misc/inquirerHost.spec.js.map +1 -0
- package/dist/commands/misc/login.js +348 -58
- package/dist/commands/misc/login.js.map +1 -1
- package/dist/commands/misc/login.spec.js +525 -7
- package/dist/commands/misc/login.spec.js.map +1 -1
- package/dist/commands/misc/logout.js +26 -3
- package/dist/commands/misc/logout.js.map +1 -1
- package/dist/commands/misc/logout.spec.js +52 -12
- package/dist/commands/misc/logout.spec.js.map +1 -1
- package/dist/commands/misc/resolveLoginTarget.spec.js +90 -0
- package/dist/commands/misc/resolveLoginTarget.spec.js.map +1 -0
- package/dist/commands/misc/scope.spec.js +108 -0
- package/dist/commands/misc/scope.spec.js.map +1 -0
- package/dist/commands/misc/set-access-token.js +1 -1
- package/dist/commands/misc/set-access-token.js.map +1 -1
- package/dist/commands/misc/set-access-token.spec.js +13 -2
- package/dist/commands/misc/set-access-token.spec.js.map +1 -1
- package/dist/commands/misc/setup.js +819 -0
- package/dist/commands/misc/setup.js.map +1 -0
- package/dist/commands/misc/setup.spec.js +783 -0
- package/dist/commands/misc/setup.spec.js.map +1 -0
- package/dist/commands/misc/status.js +168 -0
- package/dist/commands/misc/status.js.map +1 -0
- package/dist/commands/misc/status.spec.js +301 -0
- package/dist/commands/misc/status.spec.js.map +1 -0
- package/dist/commands/misc/token.js +57 -0
- package/dist/commands/misc/token.js.map +1 -0
- package/dist/commands/misc/token.spec.js +92 -0
- package/dist/commands/misc/token.spec.js.map +1 -0
- package/dist/commands/package/deletepackage.js +4 -2
- package/dist/commands/package/deletepackage.js.map +1 -1
- package/dist/commands/package/deletepackage.spec.js +7 -1
- package/dist/commands/package/deletepackage.spec.js.map +1 -1
- package/dist/commands/package/getpackage.js +142 -0
- package/dist/commands/package/getpackage.js.map +1 -0
- package/dist/commands/package/getpackage.spec.js +246 -0
- package/dist/commands/package/getpackage.spec.js.map +1 -0
- package/dist/commands/package/listpackages.js +2 -0
- package/dist/commands/package/listpackages.js.map +1 -1
- package/dist/commands/package/publish.archive.spec.js +570 -0
- package/dist/commands/package/publish.archive.spec.js.map +1 -0
- package/dist/commands/package/publish.js +780 -49
- package/dist/commands/package/publish.js.map +1 -1
- package/dist/commands/package/publish.spec.js +451 -8
- package/dist/commands/package/publish.spec.js.map +1 -1
- package/dist/commands/package/updatepackage.js +22 -19
- package/dist/commands/package/updatepackage.js.map +1 -1
- package/dist/commands/package/updatepackage.spec.js +36 -1
- package/dist/commands/package/updatepackage.spec.js.map +1 -1
- package/dist/commands/permission/createpermission.js +3 -1
- package/dist/commands/permission/createpermission.js.map +1 -1
- package/dist/commands/permission/deletepermission.js +6 -3
- package/dist/commands/permission/deletepermission.js.map +1 -1
- package/dist/commands/permission/getpermission.js +2 -0
- package/dist/commands/permission/getpermission.js.map +1 -1
- package/dist/commands/permission/listpermissions.js +2 -0
- package/dist/commands/permission/listpermissions.js.map +1 -1
- package/dist/commands/rm.js +21 -0
- package/dist/commands/rm.js.map +1 -1
- package/dist/commands/set.js +40 -6
- package/dist/commands/set.js.map +1 -1
- package/dist/commands/set.spec.js +123 -0
- package/dist/commands/set.spec.js.map +1 -0
- package/dist/commands/table/addtable.js +155 -0
- package/dist/commands/table/addtable.js.map +1 -0
- package/dist/commands/table/deletetable.js +45 -0
- package/dist/commands/table/deletetable.js.map +1 -0
- package/dist/commands/table/gettable.js +32 -0
- package/dist/commands/table/gettable.js.map +1 -0
- package/dist/commands/table/listtables.js +36 -0
- package/dist/commands/table/listtables.js.map +1 -0
- package/dist/commands/table/table.spec.js +304 -0
- package/dist/commands/table/table.spec.js.map +1 -0
- package/dist/commands/table/tablefile.js +195 -0
- package/dist/commands/table/tablefile.js.map +1 -0
- package/dist/commands/table/tablefile.spec.js +158 -0
- package/dist/commands/table/tablefile.spec.js.map +1 -0
- package/dist/commands/update.js +21 -0
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/version/archive-unarchive-version.js +4 -2
- package/dist/commands/version/archive-unarchive-version.js.map +1 -1
- package/dist/commands/version/archive-unarchive-version.spec.js +6 -1
- package/dist/commands/version/archive-unarchive-version.spec.js.map +1 -1
- package/dist/commands/version/listversions.js +2 -0
- package/dist/commands/version/listversions.js.map +1 -1
- package/dist/common/UserGroupId.js +9 -4
- package/dist/common/UserGroupId.js.map +1 -1
- package/dist/common/UserGroupId.spec.js +5 -0
- package/dist/common/UserGroupId.spec.js.map +1 -1
- package/dist/constants.js +37 -143
- package/dist/constants.js.map +1 -1
- package/dist/index.js +487 -90
- package/dist/index.js.map +1 -1
- package/dist/logger.js +42 -9
- package/dist/logger.js.map +1 -1
- package/dist/session.js +56 -0
- package/dist/session.js.map +1 -0
- package/dist/session.spec.js +103 -0
- package/dist/session.spec.js.map +1 -0
- package/dist/setup-core/briefing.js +176 -0
- package/dist/setup-core/briefing.js.map +1 -0
- package/dist/setup-core/credstore.js +415 -0
- package/dist/setup-core/credstore.js.map +1 -0
- package/dist/setup-core/credstore.spec.js +238 -0
- package/dist/setup-core/credstore.spec.js.map +1 -0
- package/dist/setup-core/environments.js +267 -0
- package/dist/setup-core/environments.js.map +1 -0
- package/dist/setup-core/flow.e2e.js +165 -0
- package/dist/setup-core/flow.e2e.js.map +1 -0
- package/dist/setup-core/flow.js +765 -0
- package/dist/setup-core/flow.js.map +1 -0
- package/dist/setup-core/flow.spec.js +1348 -0
- package/dist/setup-core/flow.spec.js.map +1 -0
- package/dist/setup-core/folderconfig.js +283 -0
- package/dist/setup-core/folderconfig.js.map +1 -0
- package/dist/setup-core/git.js +97 -0
- package/dist/setup-core/git.js.map +1 -0
- package/dist/setup-core/host.js +77 -0
- package/dist/setup-core/host.js.map +1 -0
- package/dist/setup-core/importconnections.js +470 -0
- package/dist/setup-core/importconnections.js.map +1 -0
- package/dist/setup-core/importconnections.spec.js +594 -0
- package/dist/setup-core/importconnections.spec.js.map +1 -0
- package/dist/setup-core/liveness.js +94 -0
- package/dist/setup-core/liveness.js.map +1 -0
- package/dist/setup-core/liveness.spec.js +59 -0
- package/dist/setup-core/liveness.spec.js.map +1 -0
- package/dist/setup-core/localpublisherconfig.js +26 -0
- package/dist/setup-core/localpublisherconfig.js.map +1 -0
- package/dist/setup-core/localpublisherconfig.spec.js +29 -0
- package/dist/setup-core/localpublisherconfig.spec.js.map +1 -0
- package/dist/setup-core/mcpconfig.js +198 -0
- package/dist/setup-core/mcpconfig.js.map +1 -0
- package/dist/setup-core/mcpconfig.spec.js +205 -0
- package/dist/setup-core/mcpconfig.spec.js.map +1 -0
- package/dist/setup-core/packagemanifest.js +55 -0
- package/dist/setup-core/packagemanifest.js.map +1 -0
- package/dist/setup-core/ports.js +182 -0
- package/dist/setup-core/ports.js.map +1 -0
- package/dist/setup-core/ports.spec.js +173 -0
- package/dist/setup-core/ports.spec.js.map +1 -0
- package/dist/setup-core/publisherconfig.js +268 -0
- package/dist/setup-core/publisherconfig.js.map +1 -0
- package/dist/setup-core/publisherconfig.oracle.js +166 -0
- package/dist/setup-core/publisherconfig.oracle.js.map +1 -0
- package/dist/setup-core/publisherconfig.spec.js +277 -0
- package/dist/setup-core/publisherconfig.spec.js.map +1 -0
- package/dist/setup-core/publisherversion.js +26 -0
- package/dist/setup-core/publisherversion.js.map +1 -0
- package/dist/setup-core/readiness.spec.js +161 -0
- package/dist/setup-core/readiness.spec.js.map +1 -0
- package/dist/setup-core/readylines.js +169 -0
- package/dist/setup-core/readylines.js.map +1 -0
- package/dist/setup-core/readylines.spec.js +70 -0
- package/dist/setup-core/readylines.spec.js.map +1 -0
- package/dist/setup-core/refresh.js +348 -0
- package/dist/setup-core/refresh.js.map +1 -0
- package/dist/setup-core/refresh.spec.js +501 -0
- package/dist/setup-core/refresh.spec.js.map +1 -0
- package/dist/setup-core/skills.js +279 -0
- package/dist/setup-core/skills.js.map +1 -0
- package/dist/setup-core/skills.spec.js +334 -0
- package/dist/setup-core/skills.spec.js.map +1 -0
- package/dist/setup-core/supervisor.js +879 -0
- package/dist/setup-core/supervisor.js.map +1 -0
- package/dist/setup-core/supervisor.spec.js +833 -0
- package/dist/setup-core/supervisor.spec.js.map +1 -0
- package/dist/setup-core/writefile.js +61 -0
- package/dist/setup-core/writefile.js.map +1 -0
- package/dist/setup-core/writefile.spec.js +68 -0
- package/dist/setup-core/writefile.spec.js.map +1 -0
- package/dist/utils.js +409 -3
- package/dist/utils.js.map +1 -1
- package/dist/utils.spec.js +373 -2
- package/dist/utils.spec.js.map +1 -1
- package/dist/versioncheck-refresh.js +18 -0
- package/dist/versioncheck-refresh.js.map +1 -0
- package/dist/versioncheck.js +324 -0
- package/dist/versioncheck.js.map +1 -0
- package/dist/versioncheck.spec.js +587 -0
- package/dist/versioncheck.spec.js.map +1 -0
- package/node_modules/@credibledata/cli-auth/dist/index.d.ts +86 -0
- package/node_modules/@credibledata/cli-auth/dist/index.js +102 -0
- package/node_modules/@credibledata/cli-auth/package.json +19 -0
- package/package.json +18 -6
- package/.github/workflows/build.yml +0 -23
- package/.mocharc.json +0 -10
- package/.prettierignore +0 -2
- package/.prettierrc +0 -4
- package/README-DEV.md +0 -40
- package/coverage/coverage-summary.json +0 -40
- package/coverage/tmp/coverage-2152-1789496974457-0.json +0 -1
- package/coverage/tmp/coverage-2153-1789496954404-0.json +0 -1
- package/docker/Dockerfile.ci +0 -18
- package/docker-compose.yml +0 -18
- package/eslint.config.mjs +0 -45
- package/generate-client.sh +0 -27
- package/mocha.setup.ts +0 -4
- package/openapitools.json +0 -10
- package/src/client/.openapi-generator/FILES +0 -9
- package/src/client/.openapi-generator/VERSION +0 -1
- package/src/client/.openapi-generator-ignore +0 -23
- package/src/client/api.ts +0 -15999
- package/src/client/base.ts +0 -86
- package/src/client/common.ts +0 -150
- package/src/client/configuration.ts +0 -110
- package/src/client/git_push.sh +0 -57
- package/src/client/index.ts +0 -18
- package/src/clientconfiguration.spec.ts +0 -615
- package/src/clientconfiguration.ts +0 -364
- package/src/commands/add.ts +0 -191
- package/src/commands/connection/createconnections.spec.ts +0 -413
- package/src/commands/connection/createconnections.ts +0 -109
- package/src/commands/connection/deleteconnection.spec.ts +0 -189
- package/src/commands/connection/deleteconnection.ts +0 -57
- package/src/commands/connection/listconnections.spec.ts +0 -132
- package/src/commands/connection/listconnections.ts +0 -58
- package/src/commands/environment/createenvironment.spec.ts +0 -249
- package/src/commands/environment/createenvironment.ts +0 -73
- package/src/commands/environment/deleteenvironment.spec.ts +0 -152
- package/src/commands/environment/deleteenvironment.ts +0 -48
- package/src/commands/environment/getenvironment.spec.ts +0 -110
- package/src/commands/environment/getenvironment.ts +0 -43
- package/src/commands/environment/listenvironments.spec.ts +0 -123
- package/src/commands/environment/listenvironments.ts +0 -67
- package/src/commands/environment/setenvironment.spec.ts +0 -63
- package/src/commands/environment/setenvironment.ts +0 -14
- package/src/commands/environment/updateenvironment.spec.ts +0 -386
- package/src/commands/environment/updateenvironment.ts +0 -168
- package/src/commands/get.ts +0 -153
- package/src/commands/group/addmember.spec.ts +0 -257
- package/src/commands/group/addmember.ts +0 -85
- package/src/commands/group/creategroup.spec.ts +0 -146
- package/src/commands/group/creategroup.ts +0 -54
- package/src/commands/group/deletegroup.spec.ts +0 -120
- package/src/commands/group/deletegroup.ts +0 -45
- package/src/commands/group/getgroup.spec.ts +0 -129
- package/src/commands/group/getgroup.ts +0 -47
- package/src/commands/group/listgroups.spec.ts +0 -137
- package/src/commands/group/listgroups.ts +0 -45
- package/src/commands/group/removemember.spec.ts +0 -224
- package/src/commands/group/removemember.ts +0 -75
- package/src/commands/groupaccesstoken/createToken.spec.ts +0 -211
- package/src/commands/groupaccesstoken/createToken.ts +0 -72
- package/src/commands/groupaccesstoken/deleteToken.spec.ts +0 -147
- package/src/commands/groupaccesstoken/deleteToken.ts +0 -29
- package/src/commands/groupaccesstoken/groupContainer.ts +0 -83
- package/src/commands/groupaccesstoken/listTokens.spec.ts +0 -147
- package/src/commands/groupaccesstoken/listTokens.ts +0 -29
- package/src/commands/legacy.ts +0 -5
- package/src/commands/list.ts +0 -326
- package/src/commands/materialization/cancelrun.ts +0 -70
- package/src/commands/materialization/getindex.ts +0 -55
- package/src/commands/materialization/getmaterialization.ts +0 -57
- package/src/commands/materialization/getpreaggregate.ts +0 -58
- package/src/commands/materialization/getrun.ts +0 -55
- package/src/commands/materialization/listindexes.ts +0 -69
- package/src/commands/materialization/listmaterializations.ts +0 -53
- package/src/commands/materialization/listpreaggregates.ts +0 -74
- package/src/commands/materialization/listruns.ts +0 -77
- package/src/commands/materialization/rerun.ts +0 -123
- package/src/commands/misc/login.spec.ts +0 -371
- package/src/commands/misc/login.ts +0 -343
- package/src/commands/misc/logout.spec.ts +0 -32
- package/src/commands/misc/logout.ts +0 -9
- package/src/commands/misc/loopbackOAuth.ts +0 -127
- package/src/commands/misc/set-access-token.spec.ts +0 -95
- package/src/commands/misc/set-access-token.ts +0 -32
- package/src/commands/package/deletepackage.spec.ts +0 -164
- package/src/commands/package/deletepackage.ts +0 -58
- package/src/commands/package/listpackages.spec.ts +0 -163
- package/src/commands/package/listpackages.ts +0 -74
- package/src/commands/package/publish.spec.ts +0 -642
- package/src/commands/package/publish.ts +0 -236
- package/src/commands/package/updatepackage.spec.ts +0 -319
- package/src/commands/package/updatepackage.ts +0 -95
- package/src/commands/permission/createpermission.spec.ts +0 -507
- package/src/commands/permission/createpermission.ts +0 -181
- package/src/commands/permission/deletepermission.ts +0 -117
- package/src/commands/permission/getpermission.ts +0 -115
- package/src/commands/permission/listpermissions.ts +0 -101
- package/src/commands/permission/scope.ts +0 -180
- package/src/commands/rm.ts +0 -146
- package/src/commands/set.ts +0 -25
- package/src/commands/update.ts +0 -107
- package/src/commands/version/archive-unarchive-version.spec.ts +0 -456
- package/src/commands/version/archive-unarchive-version.ts +0 -108
- package/src/commands/version/listversions.spec.ts +0 -138
- package/src/commands/version/listversions.ts +0 -45
- package/src/common/UserGroupId.spec.ts +0 -115
- package/src/common/UserGroupId.ts +0 -137
- package/src/constants.spec.ts +0 -111
- package/src/constants.ts +0 -228
- package/src/index.ts +0 -378
- package/src/logger.spec.ts +0 -158
- package/src/logger.ts +0 -90
- package/src/polyfills/file.polyfill.ts +0 -6
- package/src/utils.spec.ts +0 -135
- package/src/utils.ts +0 -115
- package/src/validator.spec.ts +0 -51
- package/src/validator.ts +0 -44
- package/tsconfig.json +0 -17
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Reading the Publisher server's boot signals.
|
|
4
|
+
*
|
|
5
|
+
* ## Use the machine-readable line, not the log lines
|
|
6
|
+
*
|
|
7
|
+
* The server prints human log lines per listener:
|
|
8
|
+
*
|
|
9
|
+
* info: Publisher server listening at http://127.0.0.1:4000
|
|
10
|
+
* info: MCP server listening at http://127.0.0.1:4040
|
|
11
|
+
*
|
|
12
|
+
* and, once initialization finishes, one line meant for exactly this purpose:
|
|
13
|
+
*
|
|
14
|
+
* PUBLISHER_READY url=http://127.0.0.1:4000 mcp=http://127.0.0.1:4040 environments=1 packages=1 load_errors=0
|
|
15
|
+
* PUBLISHER_INIT_FAILED error="..." (on stderr)
|
|
16
|
+
*
|
|
17
|
+
* The counts are the point. Both listeners bind and both log lines print even
|
|
18
|
+
* when every configured environment failed to load — a server that is running
|
|
19
|
+
* and serving nothing. Waiting on the log lines alone would have setup announce
|
|
20
|
+
* success over an empty server, which is the single most misleading thing it
|
|
21
|
+
* could do. `load_errors` and `packages` are what distinguish the two, and
|
|
22
|
+
* upstream added them for that reason.
|
|
23
|
+
*
|
|
24
|
+
* One caveat on the readiness line's URLs: they are built from the *requested*
|
|
25
|
+
* port, not the bound one. That is safe for us only because we never ask for an
|
|
26
|
+
* ephemeral port (see `ports.ts`); the log lines carry the truly-bound ports and
|
|
27
|
+
* remain the source for those.
|
|
28
|
+
*
|
|
29
|
+
* Treating another project's stdout as an API is a real coupling, so it lives in
|
|
30
|
+
* this one file with fixture tests taken from a real run. If upstream changes
|
|
31
|
+
* the wording, one file breaks and its test says which line moved.
|
|
32
|
+
*/
|
|
33
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
|
+
exports.stripAnsi = stripAnsi;
|
|
35
|
+
exports.parseReadyLine = parseReadyLine;
|
|
36
|
+
exports.parseReadinessLine = parseReadinessLine;
|
|
37
|
+
exports.parseInitFailedLine = parseInitFailedLine;
|
|
38
|
+
exports.readinessVerdict = readinessVerdict;
|
|
39
|
+
exports.dialableHost = dialableHost;
|
|
40
|
+
/**
|
|
41
|
+
* Strip ANSI SGR sequences — the server colourises its log level.
|
|
42
|
+
*
|
|
43
|
+
* The escape introducer is not optional in this pattern. Matching only `[32m`
|
|
44
|
+
* leaves the escape byte behind: parsing still works, but the "cleaned" line
|
|
45
|
+
* carries a control character into anything that echoes it.
|
|
46
|
+
*/
|
|
47
|
+
function stripAnsi(line) {
|
|
48
|
+
// eslint-disable-next-line no-control-regex
|
|
49
|
+
return line.replace(/\[[0-9;]*m/g, "");
|
|
50
|
+
}
|
|
51
|
+
const READY_PATTERNS = [
|
|
52
|
+
// Bracketed IPv6 literals are possible, so the host group is permissive and
|
|
53
|
+
// the brackets are trimmed afterwards.
|
|
54
|
+
{ which: "ui", re: /Publisher server listening at https?:\/\/(\S+):(\d+)/ },
|
|
55
|
+
{ which: "mcp", re: /MCP server listening at https?:\/\/(\S+):(\d+)/ },
|
|
56
|
+
];
|
|
57
|
+
/**
|
|
58
|
+
* Extract a bound listener address from one output line.
|
|
59
|
+
*
|
|
60
|
+
* Use this for the ports actually bound. Use {@link parseReadinessLine} to
|
|
61
|
+
* decide whether the server is usable.
|
|
62
|
+
*/
|
|
63
|
+
function parseReadyLine(line) {
|
|
64
|
+
const clean = stripAnsi(line);
|
|
65
|
+
for (const { which, re } of READY_PATTERNS) {
|
|
66
|
+
const match = clean.match(re);
|
|
67
|
+
if (match) {
|
|
68
|
+
return {
|
|
69
|
+
which,
|
|
70
|
+
host: match[1].replace(/^\[|\]$/g, ""),
|
|
71
|
+
port: Number(match[2]),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
/** Parse the `PUBLISHER_READY` line, or `undefined` for any other line. */
|
|
78
|
+
function parseReadinessLine(line) {
|
|
79
|
+
const clean = stripAnsi(line);
|
|
80
|
+
if (!clean.includes("PUBLISHER_READY")) {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
// Anchored to a field boundary, so `url=` never matches inside a later
|
|
84
|
+
// `mcp_url=`.
|
|
85
|
+
const field = (name) => { var _a; return (_a = clean.match(new RegExp(`(?:^|\\s)${name}=(\\S+)`))) === null || _a === void 0 ? void 0 : _a[1]; };
|
|
86
|
+
// A count has to parse as a non-negative integer to be one. Anything else is
|
|
87
|
+
// not a count we can reason about, and the failure has to land here rather
|
|
88
|
+
// than downstream: `readinessVerdict` compares with `===` and `>`, every one
|
|
89
|
+
// of which is false for NaN, so a `packages=n/a` from a changed upstream
|
|
90
|
+
// format would fall through all of its guards to `serving` — the exact
|
|
91
|
+
// fail-open this file exists to prevent. Returning undefined instead keeps
|
|
92
|
+
// the verdict unreachable, which the supervisor reports as a boot failure.
|
|
93
|
+
const count = (name) => {
|
|
94
|
+
const raw = field(name);
|
|
95
|
+
if (!raw)
|
|
96
|
+
return undefined;
|
|
97
|
+
const value = Number(raw);
|
|
98
|
+
return Number.isInteger(value) && value >= 0 ? value : undefined;
|
|
99
|
+
};
|
|
100
|
+
const url = field("url");
|
|
101
|
+
const mcpUrl = field("mcp");
|
|
102
|
+
const environments = count("environments");
|
|
103
|
+
const packages = count("packages");
|
|
104
|
+
const loadErrors = count("load_errors");
|
|
105
|
+
if (!url ||
|
|
106
|
+
!mcpUrl ||
|
|
107
|
+
environments === undefined ||
|
|
108
|
+
packages === undefined ||
|
|
109
|
+
loadErrors === undefined) {
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
return { url, mcpUrl, environments, packages, loadErrors };
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Parse the `PUBLISHER_INIT_FAILED` line, returning the error it reports.
|
|
116
|
+
*
|
|
117
|
+
* Upstream emits this so a script waiting on `PUBLISHER_READY` fails fast rather
|
|
118
|
+
* than hanging on a broken config — which is exactly what a supervisor watching
|
|
119
|
+
* only for success would do.
|
|
120
|
+
*/
|
|
121
|
+
function parseInitFailedLine(line) {
|
|
122
|
+
var _a, _b;
|
|
123
|
+
const clean = stripAnsi(line);
|
|
124
|
+
if (!clean.includes("PUBLISHER_INIT_FAILED")) {
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
const raw = (_b = (_a = clean.match(/error=(.*)$/)) === null || _a === void 0 ? void 0 : _a[1]) === null || _b === void 0 ? void 0 : _b.trim();
|
|
128
|
+
if (!raw)
|
|
129
|
+
return "the server did not say why";
|
|
130
|
+
try {
|
|
131
|
+
// The value is JSON-encoded, so it survives quotes and newlines.
|
|
132
|
+
return String(JSON.parse(raw));
|
|
133
|
+
}
|
|
134
|
+
catch (_c) {
|
|
135
|
+
return raw;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function readinessVerdict(readiness) {
|
|
139
|
+
if (readiness.environments === 0) {
|
|
140
|
+
return {
|
|
141
|
+
kind: "fatal",
|
|
142
|
+
reason: `the server started but no environment loaded${readiness.loadErrors > 0 ? ` (${readiness.loadErrors} failed)` : ""}, so it has no connections and nothing to query`,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
if (readiness.loadErrors > 0 || readiness.packages === 0) {
|
|
146
|
+
return {
|
|
147
|
+
kind: "degraded",
|
|
148
|
+
reason: readiness.loadErrors > 0
|
|
149
|
+
? `the environment loaded, but ${readiness.loadErrors} package${readiness.loadErrors === 1 ? "" : "s"} failed to compile — the errors are above`
|
|
150
|
+
: "the environment loaded, but no package is being served yet",
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
return { kind: "serving" };
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* The address to dial, given what the server bound.
|
|
157
|
+
*
|
|
158
|
+
* A wildcard bind (`0.0.0.0` / `::`) is not dialable, and the server prints the
|
|
159
|
+
* bind address deliberately — it is how a mistyped `--hostt`, which silently
|
|
160
|
+
* falls back to `0.0.0.0`, gets noticed. So we map the wildcard to loopback for
|
|
161
|
+
* the dialable form while leaving the printed line alone.
|
|
162
|
+
*/
|
|
163
|
+
function dialableHost(boundHost) {
|
|
164
|
+
if (boundHost === "0.0.0.0" || boundHost === "::" || boundHost === "") {
|
|
165
|
+
return "127.0.0.1";
|
|
166
|
+
}
|
|
167
|
+
return boundHost;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=readylines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readylines.js","sourceRoot":"","sources":["../../src/setup-core/readylines.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const chai_1 = require("chai");
|
|
4
|
+
const readylines_1 = require("./readylines");
|
|
5
|
+
/**
|
|
6
|
+
* Fixtures captured from a real run of `@malloy-publisher/server@0.0.248` (the
|
|
7
|
+
* version pinned when they were captured; the pin in
|
|
8
|
+
* infrastructure/malloy-versions.json has moved on since), launched with
|
|
9
|
+
* `--host 127.0.0.1 --port 0 --mcp_port 0`. Copied verbatim, colour codes
|
|
10
|
+
* included, because the colour codes are exactly what a naive parser trips on.
|
|
11
|
+
*/
|
|
12
|
+
const REAL_UI_LINE = "\u001b[32minfo\u001b[39m: Publisher server listening at http://127.0.0.1:55571";
|
|
13
|
+
const REAL_MCP_LINE = "\u001b[32minfo\u001b[39m: MCP server listening at http://127.0.0.1:55572";
|
|
14
|
+
/** Also from that run: the server refusing to save an ephemeral port. */
|
|
15
|
+
const REAL_SKIP_LINE = "\u001b[32minfo\u001b[39m: Did not write .mcp.json: this server asked for MCP port 0 and got 55572, so the port changes from run to run and a saved config would be wrong next boot.";
|
|
16
|
+
describe("readylines", () => {
|
|
17
|
+
describe("parseReadyLine", () => {
|
|
18
|
+
it("reads the UI port out of a real, colourised ready line", () => {
|
|
19
|
+
(0, chai_1.expect)((0, readylines_1.parseReadyLine)(REAL_UI_LINE)).to.eql({
|
|
20
|
+
which: "ui",
|
|
21
|
+
host: "127.0.0.1",
|
|
22
|
+
port: 55571,
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
it("reads the MCP port out of a real, colourised ready line", () => {
|
|
26
|
+
(0, chai_1.expect)((0, readylines_1.parseReadyLine)(REAL_MCP_LINE)).to.eql({
|
|
27
|
+
which: "mcp",
|
|
28
|
+
host: "127.0.0.1",
|
|
29
|
+
port: 55572,
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
it("does not mistake the mcp.json skip notice for a ready line", () => {
|
|
33
|
+
// That line mentions an MCP port too. Matching it would have the
|
|
34
|
+
// supervisor announce readiness against a port nothing is serving.
|
|
35
|
+
(0, chai_1.expect)((0, readylines_1.parseReadyLine)(REAL_SKIP_LINE)).to.equal(undefined);
|
|
36
|
+
});
|
|
37
|
+
it("ignores unrelated output", () => {
|
|
38
|
+
(0, chai_1.expect)((0, readylines_1.parseReadyLine)("info: loading package storefront")).to.equal(undefined);
|
|
39
|
+
(0, chai_1.expect)((0, readylines_1.parseReadyLine)("")).to.equal(undefined);
|
|
40
|
+
});
|
|
41
|
+
it("handles a bracketed IPv6 bind address", () => {
|
|
42
|
+
(0, chai_1.expect)((0, readylines_1.parseReadyLine)("info: MCP server listening at http://[::1]:4040")).to.eql({ which: "mcp", host: "::1", port: 4040 });
|
|
43
|
+
});
|
|
44
|
+
it("reads the default ports when no --port was passed", () => {
|
|
45
|
+
(0, chai_1.expect)((0, readylines_1.parseReadyLine)("info: Publisher server listening at http://0.0.0.0:4000")).to.eql({ which: "ui", host: "0.0.0.0", port: 4000 });
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe("stripAnsi", () => {
|
|
49
|
+
it("leaves a plain line untouched", () => {
|
|
50
|
+
(0, chai_1.expect)((0, readylines_1.stripAnsi)("info: hello")).to.equal("info: hello");
|
|
51
|
+
});
|
|
52
|
+
it("removes the level colouring", () => {
|
|
53
|
+
(0, chai_1.expect)((0, readylines_1.stripAnsi)(REAL_UI_LINE)).to.equal("info: Publisher server listening at http://127.0.0.1:55571");
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe("dialableHost", () => {
|
|
57
|
+
it("maps a wildcard bind to loopback", () => {
|
|
58
|
+
// The server prints the bind address on purpose, so a mistyped
|
|
59
|
+
// `--hostt` that silently binds 0.0.0.0 is visible. We must not repeat
|
|
60
|
+
// the wildcard in a URL we hand to a browser or an agent.
|
|
61
|
+
(0, chai_1.expect)((0, readylines_1.dialableHost)("0.0.0.0")).to.equal("127.0.0.1");
|
|
62
|
+
(0, chai_1.expect)((0, readylines_1.dialableHost)("::")).to.equal("127.0.0.1");
|
|
63
|
+
});
|
|
64
|
+
it("leaves a real address alone", () => {
|
|
65
|
+
(0, chai_1.expect)((0, readylines_1.dialableHost)("127.0.0.1")).to.equal("127.0.0.1");
|
|
66
|
+
(0, chai_1.expect)((0, readylines_1.dialableHost)("::1")).to.equal("::1");
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=readylines.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readylines.spec.js","sourceRoot":"","sources":["../../src/setup-core/readylines.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.REFRESH_LOCK_STALE_MS = exports.REFRESH_SKEW_SECONDS = void 0;
|
|
16
|
+
exports.ensureFreshTokens = ensureFreshTokens;
|
|
17
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
18
|
+
const fs_1 = __importDefault(require("fs"));
|
|
19
|
+
const path_1 = __importDefault(require("path"));
|
|
20
|
+
const environments_1 = require("./environments");
|
|
21
|
+
/**
|
|
22
|
+
* Refresh the stored Auth0 tokens before they expire.
|
|
23
|
+
*
|
|
24
|
+
* Ported from the VS Code extension's `user.ts::refreshAccessTokensIfExpired`,
|
|
25
|
+
* which until now was the only implementation — the CLI persisted a refresh
|
|
26
|
+
* token and never exchanged it, so `getRefreshToken()` had no non-test callers
|
|
27
|
+
* and every session died at the access token's `exp`.
|
|
28
|
+
*
|
|
29
|
+
* One deliberate behavioural change from the extension: refresh happens BEFORE
|
|
30
|
+
* expiry, not after. The extension only acts once a token has already expired,
|
|
31
|
+
* which turns the first request after the deadline into a failure the user sees.
|
|
32
|
+
* A local publisher session holds a token for hours, so proactive refresh is
|
|
33
|
+
* required rather than nicer — and once it exists there is no reason for
|
|
34
|
+
* anything else to wait for a 401.
|
|
35
|
+
*/
|
|
36
|
+
/**
|
|
37
|
+
* How long before `exp` to refresh. Two minutes covers a slow request that
|
|
38
|
+
* started while the token was still valid, plus modest clock skew between this
|
|
39
|
+
* machine and Auth0.
|
|
40
|
+
*/
|
|
41
|
+
exports.REFRESH_SKEW_SECONDS = 120;
|
|
42
|
+
/**
|
|
43
|
+
* How long to wait for the token endpoint before giving up and continuing on the
|
|
44
|
+
* token we already hold. Comfortably longer than a healthy round trip, short
|
|
45
|
+
* enough that a command still prints something promptly on a wedged network.
|
|
46
|
+
*/
|
|
47
|
+
const REFRESH_TIMEOUT_MS = 10000;
|
|
48
|
+
/**
|
|
49
|
+
* A refresh lock older than this belongs to a process that died holding it.
|
|
50
|
+
* A live holder keeps it for one token request, which gives up after
|
|
51
|
+
* {@link REFRESH_TIMEOUT_MS}, so twice that leaves room for the file read and
|
|
52
|
+
* write on either side.
|
|
53
|
+
*/
|
|
54
|
+
exports.REFRESH_LOCK_STALE_MS = 2 * REFRESH_TIMEOUT_MS;
|
|
55
|
+
/**
|
|
56
|
+
* How long to wait for another process's refresh before giving up. Longer than
|
|
57
|
+
* {@link REFRESH_LOCK_STALE_MS}, so a lock left by a crashed process is always
|
|
58
|
+
* broken before the wait runs out.
|
|
59
|
+
*/
|
|
60
|
+
const REFRESH_LOCK_WAIT_MS = exports.REFRESH_LOCK_STALE_MS + 5000;
|
|
61
|
+
const REFRESH_LOCK_POLL_MS = 50;
|
|
62
|
+
function isOfflineError(error) {
|
|
63
|
+
var _a, _b;
|
|
64
|
+
const code = (_a = error === null || error === void 0 ? void 0 : error.code) !== null && _a !== void 0 ? _a : (_b = error === null || error === void 0 ? void 0 : error.cause) === null || _b === void 0 ? void 0 : _b.code;
|
|
65
|
+
return (code === "ENOTFOUND" ||
|
|
66
|
+
code === "EAI_AGAIN" ||
|
|
67
|
+
code === "ECONNREFUSED" ||
|
|
68
|
+
code === "ETIMEDOUT");
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Take the refresh lock: a file beside `~/.cred`, created only if it does not
|
|
72
|
+
* exist, so exactly one process at a time gets past this.
|
|
73
|
+
*
|
|
74
|
+
* Returns a release function, or `undefined` if another process kept the lock
|
|
75
|
+
* for longer than {@link REFRESH_LOCK_WAIT_MS}. A lock older than
|
|
76
|
+
* {@link REFRESH_LOCK_STALE_MS} is removed and retaken, so a process that
|
|
77
|
+
* crashed mid-refresh cannot block every later one.
|
|
78
|
+
*
|
|
79
|
+
* An error other than "already exists" (a read-only home directory, say), on
|
|
80
|
+
* the create or on breaking a stale lock, skips the lock rather than failing
|
|
81
|
+
* the refresh. The lock narrows the race below; it
|
|
82
|
+
* is not a precondition for renewing a token.
|
|
83
|
+
*/
|
|
84
|
+
function acquireRefreshLock(lockPath) {
|
|
85
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
86
|
+
const owner = crypto_1.default.randomBytes(16).toString("hex");
|
|
87
|
+
const release = () => {
|
|
88
|
+
// Remove the lock only while it is still ours. If it was broken as stale
|
|
89
|
+
// and retaken, the file now belongs to another process.
|
|
90
|
+
try {
|
|
91
|
+
if (fs_1.default.readFileSync(lockPath, "utf-8") === owner) {
|
|
92
|
+
fs_1.default.unlinkSync(lockPath);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch (_a) {
|
|
96
|
+
// Already gone.
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const deadline = Date.now() + REFRESH_LOCK_WAIT_MS;
|
|
100
|
+
for (;;) {
|
|
101
|
+
try {
|
|
102
|
+
fs_1.default.writeFileSync(lockPath, owner, { flag: "wx", mode: 0o600 });
|
|
103
|
+
return release;
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
if ((error === null || error === void 0 ? void 0 : error.code) !== "EEXIST") {
|
|
107
|
+
return () => { };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const age = Date.now() - fs_1.default.statSync(lockPath).mtimeMs;
|
|
112
|
+
if (age > exports.REFRESH_LOCK_STALE_MS) {
|
|
113
|
+
// Break it by renaming, not unlinking: when two waiters see the
|
|
114
|
+
// same stale lock, only one rename succeeds. The other gets ENOENT
|
|
115
|
+
// and retries, so it cannot delete the lock the winner just took.
|
|
116
|
+
const broken = `${lockPath}.stale-${owner}`;
|
|
117
|
+
fs_1.default.renameSync(lockPath, broken);
|
|
118
|
+
fs_1.default.unlinkSync(broken);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
// ENOENT: the lock was released, or another waiter broke it, between
|
|
124
|
+
// our create and here. Try again at once. Anything else (a read-only
|
|
125
|
+
// or sticky home, a Windows scanner holding the file) will not clear
|
|
126
|
+
// on retry, and retrying at once would spin without ever yielding.
|
|
127
|
+
// Skip the lock instead, as for a failed create above.
|
|
128
|
+
if ((error === null || error === void 0 ? void 0 : error.code) === "ENOENT") {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
return () => { };
|
|
132
|
+
}
|
|
133
|
+
if (Date.now() >= deadline) {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
yield new Promise((resolve) => setTimeout(resolve, REFRESH_LOCK_POLL_MS));
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Ensure the stored API access token is valid for at least
|
|
142
|
+
* {@link REFRESH_SKEW_SECONDS} more seconds, exchanging the refresh token if not.
|
|
143
|
+
*
|
|
144
|
+
* Never throws: every failure mode is a returned outcome, because the callers
|
|
145
|
+
* are command entry points that need to decide between "stop and tell the user
|
|
146
|
+
* to log in" and "warn and continue".
|
|
147
|
+
*/
|
|
148
|
+
function ensureFreshTokens(store) {
|
|
149
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
150
|
+
// One deployment for the whole exchange. The POST below can take up to
|
|
151
|
+
// REFRESH_TIMEOUT_MS, and an unpinned store resolves `activeEnvironment`
|
|
152
|
+
// again on every read and write — so an `ms2ad set-env` in another terminal
|
|
153
|
+
// during the request would write this deployment's new tokens into (or
|
|
154
|
+
// clear) another deployment's slot.
|
|
155
|
+
const config = store.pinnedToCurrentEnvironment();
|
|
156
|
+
if (config.isServiceAccountToken()) {
|
|
157
|
+
return { status: "service-account" };
|
|
158
|
+
}
|
|
159
|
+
if (hasTimeLeft(config)) {
|
|
160
|
+
return { status: "fresh" };
|
|
161
|
+
}
|
|
162
|
+
// Several `cred` processes share one `~/.cred` entry per deployment, and
|
|
163
|
+
// with refresh-token rotation a refresh token can be redeemed once. Without
|
|
164
|
+
// the lock, two processes whose tokens near expiry together both POST the
|
|
165
|
+
// same refresh token. The loser gets `invalid_grant`, possibly before the
|
|
166
|
+
// winner has written its new pair, and would then clear the tokens over a
|
|
167
|
+
// renewal that succeeded.
|
|
168
|
+
// So the read, the POST and the write happen under one lock.
|
|
169
|
+
const release = yield acquireRefreshLock(`${config.getConfigPath()}.lock`);
|
|
170
|
+
if (!release) {
|
|
171
|
+
return {
|
|
172
|
+
status: "offline",
|
|
173
|
+
reason: `Another cred process has been renewing your session for over ${Math.round(REFRESH_LOCK_WAIT_MS / 1000)}s.`,
|
|
174
|
+
retry: "Run the command again in a moment.",
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
return yield refreshHoldingLock(config);
|
|
179
|
+
}
|
|
180
|
+
finally {
|
|
181
|
+
release();
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
function hasTimeLeft(config) {
|
|
186
|
+
const remaining = config.secondsUntilExpiry();
|
|
187
|
+
return remaining !== undefined && remaining > exports.REFRESH_SKEW_SECONDS;
|
|
188
|
+
}
|
|
189
|
+
function refreshHoldingLock(config) {
|
|
190
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
191
|
+
// Read again now that the lock is ours: whoever held it may have just
|
|
192
|
+
// renewed the token, and then there is nothing to send. Every read goes to
|
|
193
|
+
// the file, so this sees their write.
|
|
194
|
+
if (hasTimeLeft(config)) {
|
|
195
|
+
return { status: "fresh" };
|
|
196
|
+
}
|
|
197
|
+
const remaining = config.secondsUntilExpiry();
|
|
198
|
+
const refreshToken = config.getRefreshToken();
|
|
199
|
+
if (!refreshToken) {
|
|
200
|
+
// No refresh token means nothing to renew with, and no answer from Auth0
|
|
201
|
+
// about whether the session is dead — so nothing here is proof enough to
|
|
202
|
+
// clear the store. Destroying it would also take the organization and
|
|
203
|
+
// environment with it, which the `cred login` that fixes this reuses.
|
|
204
|
+
if (config.getApiAccessToken() === undefined) {
|
|
205
|
+
return {
|
|
206
|
+
status: "logged-out",
|
|
207
|
+
reason: "You are not logged in. Run `cred login`.",
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
if (remaining !== undefined && remaining > 0) {
|
|
211
|
+
return {
|
|
212
|
+
status: "not-renewable",
|
|
213
|
+
reason: `Your session expires in ${remaining}s and has no refresh token to renew it. Run \`cred login\` to start a new one.`,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
status: "logged-out",
|
|
218
|
+
reason: "Your session expired and there is no refresh token. Run `cred login`.",
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
const environment = config.getEnvironment();
|
|
222
|
+
const { domain, clientId } = environments_1.auth0ConfigsByEnv[environment];
|
|
223
|
+
// `fetch`, not the `axios` every other HTTP call in `cli/src` uses — and
|
|
224
|
+
// deliberately, so the choice is not read as a slip. `setup-core` is a
|
|
225
|
+
// library to be lifted into the VS Code extension by `git mv`, and its only
|
|
226
|
+
// dependencies should be ones both hosts already have. `fetch` is in the
|
|
227
|
+
// Node and VS Code runtimes; axios would make the extension inherit a
|
|
228
|
+
// dependency for two requests. The cost is that `printOutError` /
|
|
229
|
+
// `isAxiosError` do not apply here, which is why `isOfflineError` above
|
|
230
|
+
// classifies by `code` instead.
|
|
231
|
+
let response;
|
|
232
|
+
try {
|
|
233
|
+
response = yield fetch(`${domain}/oauth/token`, {
|
|
234
|
+
method: "POST",
|
|
235
|
+
headers: { "Content-Type": "application/json" },
|
|
236
|
+
body: JSON.stringify({
|
|
237
|
+
grant_type: "refresh_token",
|
|
238
|
+
client_id: clientId,
|
|
239
|
+
refresh_token: refreshToken,
|
|
240
|
+
}),
|
|
241
|
+
// A refresh with no deadline can hang for as long as the OS lets the
|
|
242
|
+
// socket live. Every caller is a command entry point that has to decide
|
|
243
|
+
// something, and "continue on the token we have" is a good answer after
|
|
244
|
+
// 10s — whereas a silent multi-minute stall before any output is not.
|
|
245
|
+
signal: AbortSignal.timeout(REFRESH_TIMEOUT_MS),
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
if (isOfflineError(error)) {
|
|
250
|
+
return {
|
|
251
|
+
status: "offline",
|
|
252
|
+
reason: `Could not reach ${domain} to refresh your session.`,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
return {
|
|
256
|
+
status: "offline",
|
|
257
|
+
reason: `Refreshing your session failed: ${error instanceof Error ? error.message : String(error)}.`,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
let payload;
|
|
261
|
+
try {
|
|
262
|
+
payload = yield response.json();
|
|
263
|
+
}
|
|
264
|
+
catch (_a) {
|
|
265
|
+
return {
|
|
266
|
+
status: "offline",
|
|
267
|
+
reason: `${domain} returned an unreadable refresh response (HTTP ${response.status}).`,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
// `invalid_grant` means the token WE sent is dead — revoked, rotated, or
|
|
271
|
+
// expired. That is usually terminal, so clear the tokens rather than leave
|
|
272
|
+
// credentials that will fail every subsequent call. But "rotated" has a
|
|
273
|
+
// second cause: another process redeemed the same refresh token first and
|
|
274
|
+
// wrote its replacement.
|
|
275
|
+
//
|
|
276
|
+
// The lock above keeps other `cred` processes out, but not the VS Code
|
|
277
|
+
// extension, which shares `~/.cred` and refreshes without it. So check the
|
|
278
|
+
// file before clearing it: a refresh token there that is no longer the one
|
|
279
|
+
// we sent means someone else rotated it, and the store already holds a fresh
|
|
280
|
+
// pair.
|
|
281
|
+
//
|
|
282
|
+
// An EMPTY on-disk token is not a rotation: the VS Code extension's
|
|
283
|
+
// `clearState()` writes `''` on sign-out and on most refresh errors. Counting
|
|
284
|
+
// that as a rotation would report `fresh` and send the stale access token.
|
|
285
|
+
if (payload.error === "invalid_grant" || payload.error === "invalid_token") {
|
|
286
|
+
const onDisk = config.getRefreshToken();
|
|
287
|
+
if (onDisk && onDisk !== refreshToken) {
|
|
288
|
+
return { status: "fresh" };
|
|
289
|
+
}
|
|
290
|
+
try {
|
|
291
|
+
// Only the tokens: the organization and environment stay, so the
|
|
292
|
+
// `cred login` this asks for signs back in to the same place.
|
|
293
|
+
config.clearTokens();
|
|
294
|
+
}
|
|
295
|
+
catch (_b) {
|
|
296
|
+
// An unwritable `~/.cred` keeps the dead tokens on disk. The session
|
|
297
|
+
// is over either way, and this function must not throw.
|
|
298
|
+
}
|
|
299
|
+
return {
|
|
300
|
+
status: "logged-out",
|
|
301
|
+
reason: `Your session is no longer valid (${payload.error}). Run \`cred login\`.`,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
if (payload.error) {
|
|
305
|
+
return {
|
|
306
|
+
status: "offline",
|
|
307
|
+
reason: `Auth0 refused the refresh (${payload.error}${payload.error_description ? `: ${payload.error_description}` : ""}).`,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
// A response carrying neither an error code nor a token tells us nothing
|
|
311
|
+
// about the refresh token: an HTTP error page from a proxy in front of Auth0
|
|
312
|
+
// parses as JSON and lands exactly here. Destroying credentials needs proof
|
|
313
|
+
// they are dead, and the only proof is the explicit `invalid_grant` /
|
|
314
|
+
// `invalid_token` above. So keep the token and report the HTTP status —
|
|
315
|
+
// whoever debugs this needs to know a 502 is not a logout.
|
|
316
|
+
if (!payload.access_token) {
|
|
317
|
+
return {
|
|
318
|
+
status: "offline",
|
|
319
|
+
reason: `${domain} returned no access token and no error on refresh (HTTP ${response.status}).`,
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
try {
|
|
323
|
+
config.setTokenPair({
|
|
324
|
+
accessToken: payload.access_token,
|
|
325
|
+
idToken: payload.id_token,
|
|
326
|
+
// Auth0 rotates refresh tokens when rotation is enabled; keep the new
|
|
327
|
+
// one when offered, otherwise the stored one stays valid.
|
|
328
|
+
refreshToken: payload.refresh_token,
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
catch (error) {
|
|
332
|
+
// A read-only home directory (or `~/.cred` itself): Auth0 renewed the
|
|
333
|
+
// session, but nothing can be saved. Thrown, this escaped a function
|
|
334
|
+
// whose callers rely on it returning, and printed a bare EACCES. As an
|
|
335
|
+
// `offline` outcome the command carries on while the old token is valid,
|
|
336
|
+
// then stops with a message that names the fix.
|
|
337
|
+
const configPath = config.getConfigPath();
|
|
338
|
+
const code = error === null || error === void 0 ? void 0 : error.code;
|
|
339
|
+
return {
|
|
340
|
+
status: "offline",
|
|
341
|
+
reason: `Renewed your session, but could not save it to ${configPath}${code ? ` (${code})` : ""}.`,
|
|
342
|
+
retry: `Make ${path_1.default.dirname(configPath)} writable, then run the command again.`,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
return { status: "fresh" };
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=refresh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../src/setup-core/refresh.ts"],"names":[],"mappings":"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"}
|