@rockcarver/frodo-cli 2.0.0-59 → 2.0.0-60
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/.vscode/launch.json +1 -0
- package/CHANGELOG.md +10 -1
- package/dist/app.cjs +187368 -0
- package/dist/app.cjs.map +1 -0
- package/dist/app.d.cts +2 -0
- package/dist/chunk-MPPKDFVI.cjs +56 -0
- package/dist/chunk-MPPKDFVI.cjs.map +1 -0
- package/dist/launch.cjs +27 -0
- package/dist/launch.cjs.map +1 -0
- package/dist/launch.d.cts +1 -0
- package/dist/loader.cjs +836 -0
- package/dist/loader.cjs.map +1 -0
- package/dist/loader.d.cts +3 -0
- package/package.json +37 -53
- package/tsup.config.ts +40 -0
- package/esm/app.js +0 -80
- package/esm/app.js.map +0 -1
- package/esm/cli/FrodoCommand.js +0 -181
- package/esm/cli/FrodoCommand.js.map +0 -1
- package/esm/cli/_template/something-delete.js +0 -20
- package/esm/cli/_template/something-delete.js.map +0 -1
- package/esm/cli/_template/something-describe.js +0 -20
- package/esm/cli/_template/something-describe.js.map +0 -1
- package/esm/cli/_template/something-else-delete.js +0 -20
- package/esm/cli/_template/something-else-delete.js.map +0 -1
- package/esm/cli/_template/something-else-describe.js +0 -20
- package/esm/cli/_template/something-else-describe.js.map +0 -1
- package/esm/cli/_template/something-else-export.js +0 -20
- package/esm/cli/_template/something-else-export.js.map +0 -1
- package/esm/cli/_template/something-else-import.js +0 -20
- package/esm/cli/_template/something-else-import.js.map +0 -1
- package/esm/cli/_template/something-else-list.js +0 -20
- package/esm/cli/_template/something-else-list.js.map +0 -1
- package/esm/cli/_template/something-else.js +0 -17
- package/esm/cli/_template/something-else.js.map +0 -1
- package/esm/cli/_template/something-export.js +0 -20
- package/esm/cli/_template/something-export.js.map +0 -1
- package/esm/cli/_template/something-import.js +0 -20
- package/esm/cli/_template/something-import.js.map +0 -1
- package/esm/cli/_template/something-list.js +0 -20
- package/esm/cli/_template/something-list.js.map +0 -1
- package/esm/cli/_template/something-other-delete.js +0 -20
- package/esm/cli/_template/something-other-delete.js.map +0 -1
- package/esm/cli/_template/something-other-describe.js +0 -20
- package/esm/cli/_template/something-other-describe.js.map +0 -1
- package/esm/cli/_template/something-other-export.js +0 -20
- package/esm/cli/_template/something-other-export.js.map +0 -1
- package/esm/cli/_template/something-other-import.js +0 -20
- package/esm/cli/_template/something-other-import.js.map +0 -1
- package/esm/cli/_template/something-other-list.js +0 -20
- package/esm/cli/_template/something-other-list.js.map +0 -1
- package/esm/cli/_template/something-other.js +0 -17
- package/esm/cli/_template/something-other.js.map +0 -1
- package/esm/cli/_template/something.js +0 -20
- package/esm/cli/_template/something.js.map +0 -1
- package/esm/cli/admin/admin-add-autoid-static-user-mapping.js +0 -23
- package/esm/cli/admin/admin-add-autoid-static-user-mapping.js.map +0 -1
- package/esm/cli/admin/admin-create-oauth2-client-with-admin-privileges.js +0 -80
- package/esm/cli/admin/admin-create-oauth2-client-with-admin-privileges.js.map +0 -1
- package/esm/cli/admin/admin-execute-rfc7523-authz-grant-flow.js +0 -40
- package/esm/cli/admin/admin-execute-rfc7523-authz-grant-flow.js.map +0 -1
- package/esm/cli/admin/admin-federation-export.js +0 -43
- package/esm/cli/admin/admin-federation-export.js.map +0 -1
- package/esm/cli/admin/admin-federation-import.js +0 -47
- package/esm/cli/admin/admin-federation-import.js.map +0 -1
- package/esm/cli/admin/admin-federation-list.js +0 -27
- package/esm/cli/admin/admin-federation-list.js.map +0 -1
- package/esm/cli/admin/admin-federation.js +0 -21
- package/esm/cli/admin/admin-federation.js.map +0 -1
- package/esm/cli/admin/admin-generate-rfc7523-authz-grant-artefacts.js +0 -43
- package/esm/cli/admin/admin-generate-rfc7523-authz-grant-artefacts.js.map +0 -1
- package/esm/cli/admin/admin-get-access-token.js +0 -27
- package/esm/cli/admin/admin-get-access-token.js.map +0 -1
- package/esm/cli/admin/admin-grant-oauth2-client-admin-privileges.js +0 -25
- package/esm/cli/admin/admin-grant-oauth2-client-admin-privileges.js.map +0 -1
- package/esm/cli/admin/admin-hide-generic-extension-attributes.js +0 -25
- package/esm/cli/admin/admin-hide-generic-extension-attributes.js.map +0 -1
- package/esm/cli/admin/admin-list-oauth2-clients-with-admin-privileges.js +0 -24
- package/esm/cli/admin/admin-list-oauth2-clients-with-admin-privileges.js.map +0 -1
- package/esm/cli/admin/admin-list-oauth2-clients-with-custom-privileges.js +0 -24
- package/esm/cli/admin/admin-list-oauth2-clients-with-custom-privileges.js.map +0 -1
- package/esm/cli/admin/admin-list-static-user-mappings.js +0 -24
- package/esm/cli/admin/admin-list-static-user-mappings.js.map +0 -1
- package/esm/cli/admin/admin-remove-static-user-mapping.js +0 -24
- package/esm/cli/admin/admin-remove-static-user-mapping.js.map +0 -1
- package/esm/cli/admin/admin-repair-org-model.js +0 -25
- package/esm/cli/admin/admin-repair-org-model.js.map +0 -1
- package/esm/cli/admin/admin-revoke-oauth2-client-admin-privileges.js +0 -25
- package/esm/cli/admin/admin-revoke-oauth2-client-admin-privileges.js.map +0 -1
- package/esm/cli/admin/admin-show-generic-extension-attributes.js +0 -25
- package/esm/cli/admin/admin-show-generic-extension-attributes.js.map +0 -1
- package/esm/cli/admin/admin-train-auto-access-model.js +0 -32
- package/esm/cli/admin/admin-train-auto-access-model.js.map +0 -1
- package/esm/cli/admin/admin.js +0 -41
- package/esm/cli/admin/admin.js.map +0 -1
- package/esm/cli/agent/agent-delete.js +0 -38
- package/esm/cli/agent/agent-delete.js.map +0 -1
- package/esm/cli/agent/agent-describe.js +0 -20
- package/esm/cli/agent/agent-describe.js.map +0 -1
- package/esm/cli/agent/agent-export.js +0 -43
- package/esm/cli/agent/agent-export.js.map +0 -1
- package/esm/cli/agent/agent-gateway-delete.js +0 -38
- package/esm/cli/agent/agent-gateway-delete.js.map +0 -1
- package/esm/cli/agent/agent-gateway-describe.js +0 -20
- package/esm/cli/agent/agent-gateway-describe.js.map +0 -1
- package/esm/cli/agent/agent-gateway-export.js +0 -43
- package/esm/cli/agent/agent-gateway-export.js.map +0 -1
- package/esm/cli/agent/agent-gateway-import.js +0 -49
- package/esm/cli/agent/agent-gateway-import.js.map +0 -1
- package/esm/cli/agent/agent-gateway-list.js +0 -22
- package/esm/cli/agent/agent-gateway-list.js.map +0 -1
- package/esm/cli/agent/agent-gateway.js +0 -17
- package/esm/cli/agent/agent-gateway.js.map +0 -1
- package/esm/cli/agent/agent-import.js +0 -49
- package/esm/cli/agent/agent-import.js.map +0 -1
- package/esm/cli/agent/agent-java-delete.js +0 -38
- package/esm/cli/agent/agent-java-delete.js.map +0 -1
- package/esm/cli/agent/agent-java-describe.js +0 -20
- package/esm/cli/agent/agent-java-describe.js.map +0 -1
- package/esm/cli/agent/agent-java-export.js +0 -43
- package/esm/cli/agent/agent-java-export.js.map +0 -1
- package/esm/cli/agent/agent-java-import.js +0 -49
- package/esm/cli/agent/agent-java-import.js.map +0 -1
- package/esm/cli/agent/agent-java-list.js +0 -22
- package/esm/cli/agent/agent-java-list.js.map +0 -1
- package/esm/cli/agent/agent-java.js +0 -17
- package/esm/cli/agent/agent-java.js.map +0 -1
- package/esm/cli/agent/agent-list.js +0 -22
- package/esm/cli/agent/agent-list.js.map +0 -1
- package/esm/cli/agent/agent-web-delete.js +0 -38
- package/esm/cli/agent/agent-web-delete.js.map +0 -1
- package/esm/cli/agent/agent-web-describe.js +0 -20
- package/esm/cli/agent/agent-web-describe.js.map +0 -1
- package/esm/cli/agent/agent-web-export.js +0 -43
- package/esm/cli/agent/agent-web-export.js.map +0 -1
- package/esm/cli/agent/agent-web-import.js +0 -49
- package/esm/cli/agent/agent-web-import.js.map +0 -1
- package/esm/cli/agent/agent-web-list.js +0 -22
- package/esm/cli/agent/agent-web-list.js.map +0 -1
- package/esm/cli/agent/agent-web.js +0 -17
- package/esm/cli/agent/agent-web.js.map +0 -1
- package/esm/cli/agent/agent.js +0 -22
- package/esm/cli/agent/agent.js.map +0 -1
- package/esm/cli/app/app-delete.js +0 -36
- package/esm/cli/app/app-delete.js.map +0 -1
- package/esm/cli/app/app-describe.js +0 -21
- package/esm/cli/app/app-describe.js.map +0 -1
- package/esm/cli/app/app-export.js +0 -51
- package/esm/cli/app/app-export.js.map +0 -1
- package/esm/cli/app/app-import.js +0 -56
- package/esm/cli/app/app-import.js.map +0 -1
- package/esm/cli/app/app-list.js +0 -25
- package/esm/cli/app/app-list.js.map +0 -1
- package/esm/cli/app/app.js +0 -18
- package/esm/cli/app/app.js.map +0 -1
- package/esm/cli/authn/authn-describe.js +0 -28
- package/esm/cli/authn/authn-describe.js.map +0 -1
- package/esm/cli/authn/authn-export.js +0 -24
- package/esm/cli/authn/authn-export.js.map +0 -1
- package/esm/cli/authn/authn-import.js +0 -24
- package/esm/cli/authn/authn-import.js.map +0 -1
- package/esm/cli/authn/authn.js +0 -12
- package/esm/cli/authn/authn.js.map +0 -1
- package/esm/cli/authz/authz-policy-delete.js +0 -41
- package/esm/cli/authz/authz-policy-delete.js.map +0 -1
- package/esm/cli/authz/authz-policy-describe.js +0 -28
- package/esm/cli/authz/authz-policy-describe.js.map +0 -1
- package/esm/cli/authz/authz-policy-export.js +0 -73
- package/esm/cli/authz/authz-policy-export.js.map +0 -1
- package/esm/cli/authz/authz-policy-import.js +0 -63
- package/esm/cli/authz/authz-policy-import.js.map +0 -1
- package/esm/cli/authz/authz-policy-list.js +0 -35
- package/esm/cli/authz/authz-policy-list.js.map +0 -1
- package/esm/cli/authz/authz-policy.js +0 -17
- package/esm/cli/authz/authz-policy.js.map +0 -1
- package/esm/cli/authz/authz-set-delete.js +0 -35
- package/esm/cli/authz/authz-set-delete.js.map +0 -1
- package/esm/cli/authz/authz-set-describe.js +0 -28
- package/esm/cli/authz/authz-set-describe.js.map +0 -1
- package/esm/cli/authz/authz-set-export.js +0 -53
- package/esm/cli/authz/authz-set-export.js.map +0 -1
- package/esm/cli/authz/authz-set-import.js +0 -59
- package/esm/cli/authz/authz-set-import.js.map +0 -1
- package/esm/cli/authz/authz-set-list.js +0 -23
- package/esm/cli/authz/authz-set-list.js.map +0 -1
- package/esm/cli/authz/authz-set.js +0 -17
- package/esm/cli/authz/authz-set.js.map +0 -1
- package/esm/cli/authz/authz-type-delete.js +0 -41
- package/esm/cli/authz/authz-type-delete.js.map +0 -1
- package/esm/cli/authz/authz-type-describe.js +0 -32
- package/esm/cli/authz/authz-type-describe.js.map +0 -1
- package/esm/cli/authz/authz-type-export.js +0 -47
- package/esm/cli/authz/authz-type-export.js.map +0 -1
- package/esm/cli/authz/authz-type-import.js +0 -53
- package/esm/cli/authz/authz-type-import.js.map +0 -1
- package/esm/cli/authz/authz-type-list.js +0 -24
- package/esm/cli/authz/authz-type-list.js.map +0 -1
- package/esm/cli/authz/authz-type.js +0 -17
- package/esm/cli/authz/authz-type.js.map +0 -1
- package/esm/cli/authz/authz.js +0 -12
- package/esm/cli/authz/authz.js.map +0 -1
- package/esm/cli/config/config-delete.js +0 -20
- package/esm/cli/config/config-delete.js.map +0 -1
- package/esm/cli/config/config-describe.js +0 -20
- package/esm/cli/config/config-describe.js.map +0 -1
- package/esm/cli/config/config-export.js +0 -52
- package/esm/cli/config/config-export.js.map +0 -1
- package/esm/cli/config/config-import.js +0 -62
- package/esm/cli/config/config-import.js.map +0 -1
- package/esm/cli/config/config-list.js +0 -20
- package/esm/cli/config/config-list.js.map +0 -1
- package/esm/cli/config/config.js +0 -22
- package/esm/cli/config/config.js.map +0 -1
- package/esm/cli/conn/conn-delete.js +0 -21
- package/esm/cli/conn/conn-delete.js.map +0 -1
- package/esm/cli/conn/conn-describe.js +0 -16
- package/esm/cli/conn/conn-describe.js.map +0 -1
- package/esm/cli/conn/conn-list.js +0 -16
- package/esm/cli/conn/conn-list.js.map +0 -1
- package/esm/cli/conn/conn-save.js +0 -106
- package/esm/cli/conn/conn-save.js.map +0 -1
- package/esm/cli/conn/conn.js +0 -16
- package/esm/cli/conn/conn.js.map +0 -1
- package/esm/cli/email/email-template-export.js +0 -42
- package/esm/cli/email/email-template-export.js.map +0 -1
- package/esm/cli/email/email-template-import.js +0 -47
- package/esm/cli/email/email-template-import.js.map +0 -1
- package/esm/cli/email/email-template-list.js +0 -24
- package/esm/cli/email/email-template-list.js.map +0 -1
- package/esm/cli/email/email-template.js +0 -13
- package/esm/cli/email/email-template.js.map +0 -1
- package/esm/cli/email/email.js +0 -9
- package/esm/cli/email/email.js.map +0 -1
- package/esm/cli/esv/esv-apply.js +0 -61
- package/esm/cli/esv/esv-apply.js.map +0 -1
- package/esm/cli/esv/esv-secret-create.js +0 -29
- package/esm/cli/esv/esv-secret-create.js.map +0 -1
- package/esm/cli/esv/esv-secret-delete.js +0 -34
- package/esm/cli/esv/esv-secret-delete.js.map +0 -1
- package/esm/cli/esv/esv-secret-describe.js +0 -24
- package/esm/cli/esv/esv-secret-describe.js.map +0 -1
- package/esm/cli/esv/esv-secret-export.js +0 -34
- package/esm/cli/esv/esv-secret-export.js.map +0 -1
- package/esm/cli/esv/esv-secret-import.js +0 -20
- package/esm/cli/esv/esv-secret-import.js.map +0 -1
- package/esm/cli/esv/esv-secret-list.js +0 -24
- package/esm/cli/esv/esv-secret-list.js.map +0 -1
- package/esm/cli/esv/esv-secret-set.js +0 -24
- package/esm/cli/esv/esv-secret-set.js.map +0 -1
- package/esm/cli/esv/esv-secret-version-activate.js +0 -28
- package/esm/cli/esv/esv-secret-version-activate.js.map +0 -1
- package/esm/cli/esv/esv-secret-version-create.js +0 -29
- package/esm/cli/esv/esv-secret-version-create.js.map +0 -1
- package/esm/cli/esv/esv-secret-version-deactivate.js +0 -28
- package/esm/cli/esv/esv-secret-version-deactivate.js.map +0 -1
- package/esm/cli/esv/esv-secret-version-delete.js +0 -34
- package/esm/cli/esv/esv-secret-version-delete.js.map +0 -1
- package/esm/cli/esv/esv-secret-version-list.js +0 -24
- package/esm/cli/esv/esv-secret-version-list.js.map +0 -1
- package/esm/cli/esv/esv-secret-version.js +0 -17
- package/esm/cli/esv/esv-secret-version.js.map +0 -1
- package/esm/cli/esv/esv-secret.js +0 -25
- package/esm/cli/esv/esv-secret.js.map +0 -1
- package/esm/cli/esv/esv-variable-create.js +0 -24
- package/esm/cli/esv/esv-variable-create.js.map +0 -1
- package/esm/cli/esv/esv-variable-delete.js +0 -35
- package/esm/cli/esv/esv-variable-delete.js.map +0 -1
- package/esm/cli/esv/esv-variable-describe.js +0 -24
- package/esm/cli/esv/esv-variable-describe.js.map +0 -1
- package/esm/cli/esv/esv-variable-export.js +0 -35
- package/esm/cli/esv/esv-variable-export.js.map +0 -1
- package/esm/cli/esv/esv-variable-import.js +0 -20
- package/esm/cli/esv/esv-variable-import.js.map +0 -1
- package/esm/cli/esv/esv-variable-list.js +0 -24
- package/esm/cli/esv/esv-variable-list.js.map +0 -1
- package/esm/cli/esv/esv-variable-set.js +0 -31
- package/esm/cli/esv/esv-variable-set.js.map +0 -1
- package/esm/cli/esv/esv-variable.js +0 -23
- package/esm/cli/esv/esv-variable.js.map +0 -1
- package/esm/cli/esv/esv.js +0 -12
- package/esm/cli/esv/esv.js.map +0 -1
- package/esm/cli/idm/idm-count.js +0 -24
- package/esm/cli/idm/idm-count.js.map +0 -1
- package/esm/cli/idm/idm-export.js +0 -50
- package/esm/cli/idm/idm-export.js.map +0 -1
- package/esm/cli/idm/idm-import.js +0 -54
- package/esm/cli/idm/idm-import.js.map +0 -1
- package/esm/cli/idm/idm-list.js +0 -28
- package/esm/cli/idm/idm-list.js.map +0 -1
- package/esm/cli/idm/idm.js +0 -14
- package/esm/cli/idm/idm.js.map +0 -1
- package/esm/cli/idp/idp-export.js +0 -44
- package/esm/cli/idp/idp-export.js.map +0 -1
- package/esm/cli/idp/idp-import.js +0 -56
- package/esm/cli/idp/idp-import.js.map +0 -1
- package/esm/cli/idp/idp-list.js +0 -28
- package/esm/cli/idp/idp-list.js.map +0 -1
- package/esm/cli/idp/idp.js +0 -12
- package/esm/cli/idp/idp.js.map +0 -1
- package/esm/cli/info/info.js +0 -52
- package/esm/cli/info/info.js.map +0 -1
- package/esm/cli/journey/journey-delete.js +0 -36
- package/esm/cli/journey/journey-delete.js.map +0 -1
- package/esm/cli/journey/journey-describe.js +0 -133
- package/esm/cli/journey/journey-describe.js.map +0 -1
- package/esm/cli/journey/journey-disable.js +0 -35
- package/esm/cli/journey/journey-disable.js.map +0 -1
- package/esm/cli/journey/journey-enable.js +0 -35
- package/esm/cli/journey/journey-enable.js.map +0 -1
- package/esm/cli/journey/journey-export.js +0 -63
- package/esm/cli/journey/journey-export.js.map +0 -1
- package/esm/cli/journey/journey-import.js +0 -59
- package/esm/cli/journey/journey-import.js.map +0 -1
- package/esm/cli/journey/journey-list.js +0 -25
- package/esm/cli/journey/journey-list.js.map +0 -1
- package/esm/cli/journey/journey-prune.js +0 -42
- package/esm/cli/journey/journey-prune.js.map +0 -1
- package/esm/cli/journey/journey.js +0 -22
- package/esm/cli/journey/journey.js.map +0 -1
- package/esm/cli/log/log-fetch.js +0 -127
- package/esm/cli/log/log-fetch.js.map +0 -1
- package/esm/cli/log/log-key-delete.js +0 -33
- package/esm/cli/log/log-key-delete.js.map +0 -1
- package/esm/cli/log/log-key-describe.js +0 -20
- package/esm/cli/log/log-key-describe.js.map +0 -1
- package/esm/cli/log/log-key-list.js +0 -24
- package/esm/cli/log/log-key-list.js.map +0 -1
- package/esm/cli/log/log-key.js +0 -13
- package/esm/cli/log/log-key.js.map +0 -1
- package/esm/cli/log/log-list.js +0 -89
- package/esm/cli/log/log-list.js.map +0 -1
- package/esm/cli/log/log-tail.js +0 -81
- package/esm/cli/log/log-tail.js.map +0 -1
- package/esm/cli/log/log.js +0 -18
- package/esm/cli/log/log.js.map +0 -1
- package/esm/cli/oauth/oauth-client-delete.js +0 -20
- package/esm/cli/oauth/oauth-client-delete.js.map +0 -1
- package/esm/cli/oauth/oauth-client-describe.js +0 -20
- package/esm/cli/oauth/oauth-client-describe.js.map +0 -1
- package/esm/cli/oauth/oauth-client-export.js +0 -50
- package/esm/cli/oauth/oauth-client-export.js.map +0 -1
- package/esm/cli/oauth/oauth-client-import.js +0 -55
- package/esm/cli/oauth/oauth-client-import.js.map +0 -1
- package/esm/cli/oauth/oauth-client-list.js +0 -24
- package/esm/cli/oauth/oauth-client-list.js.map +0 -1
- package/esm/cli/oauth/oauth-client.js +0 -22
- package/esm/cli/oauth/oauth-client.js.map +0 -1
- package/esm/cli/oauth/oauth.js +0 -11
- package/esm/cli/oauth/oauth.js.map +0 -1
- package/esm/cli/realm/realm-add-custom-domain.js +0 -24
- package/esm/cli/realm/realm-add-custom-domain.js.map +0 -1
- package/esm/cli/realm/realm-describe.js +0 -23
- package/esm/cli/realm/realm-describe.js.map +0 -1
- package/esm/cli/realm/realm-list.js +0 -23
- package/esm/cli/realm/realm-list.js.map +0 -1
- package/esm/cli/realm/realm-remove-custom-domain.js +0 -26
- package/esm/cli/realm/realm-remove-custom-domain.js.map +0 -1
- package/esm/cli/realm/realm.js +0 -21
- package/esm/cli/realm/realm.js.map +0 -1
- package/esm/cli/saml/saml-cot-export.js +0 -42
- package/esm/cli/saml/saml-cot-export.js.map +0 -1
- package/esm/cli/saml/saml-cot-import.js +0 -48
- package/esm/cli/saml/saml-cot-import.js.map +0 -1
- package/esm/cli/saml/saml-cot-list.js +0 -25
- package/esm/cli/saml/saml-cot-list.js.map +0 -1
- package/esm/cli/saml/saml-cot.js +0 -13
- package/esm/cli/saml/saml-cot.js.map +0 -1
- package/esm/cli/saml/saml-delete.js +0 -37
- package/esm/cli/saml/saml-delete.js.map +0 -1
- package/esm/cli/saml/saml-describe.js +0 -25
- package/esm/cli/saml/saml-describe.js.map +0 -1
- package/esm/cli/saml/saml-export.js +0 -48
- package/esm/cli/saml/saml-export.js.map +0 -1
- package/esm/cli/saml/saml-import.js +0 -56
- package/esm/cli/saml/saml-import.js.map +0 -1
- package/esm/cli/saml/saml-list.js +0 -25
- package/esm/cli/saml/saml-list.js.map +0 -1
- package/esm/cli/saml/saml-metadata-export.js +0 -42
- package/esm/cli/saml/saml-metadata-export.js.map +0 -1
- package/esm/cli/saml/saml-metadata.js +0 -9
- package/esm/cli/saml/saml-metadata.js.map +0 -1
- package/esm/cli/saml/saml.js +0 -20
- package/esm/cli/saml/saml.js.map +0 -1
- package/esm/cli/script/script-delete.js +0 -37
- package/esm/cli/script/script-delete.js.map +0 -1
- package/esm/cli/script/script-describe.js +0 -20
- package/esm/cli/script/script-describe.js.map +0 -1
- package/esm/cli/script/script-export.js +0 -52
- package/esm/cli/script/script-export.js.map +0 -1
- package/esm/cli/script/script-import.js +0 -45
- package/esm/cli/script/script-import.js.map +0 -1
- package/esm/cli/script/script-list.js +0 -25
- package/esm/cli/script/script-list.js.map +0 -1
- package/esm/cli/script/script.js +0 -18
- package/esm/cli/script/script.js.map +0 -1
- package/esm/cli/service/service-delete.js +0 -23
- package/esm/cli/service/service-delete.js.map +0 -1
- package/esm/cli/service/service-export.js +0 -41
- package/esm/cli/service/service-export.js.map +0 -1
- package/esm/cli/service/service-import.js +0 -65
- package/esm/cli/service/service-import.js.map +0 -1
- package/esm/cli/service/service-list.js +0 -20
- package/esm/cli/service/service-list.js.map +0 -1
- package/esm/cli/service/service.js +0 -14
- package/esm/cli/service/service.js.map +0 -1
- package/esm/cli/shell/shell.js +0 -53
- package/esm/cli/shell/shell.js.map +0 -1
- package/esm/cli/theme/theme-delete.js +0 -42
- package/esm/cli/theme/theme-delete.js.map +0 -1
- package/esm/cli/theme/theme-export.js +0 -48
- package/esm/cli/theme/theme-export.js.map +0 -1
- package/esm/cli/theme/theme-import.js +0 -54
- package/esm/cli/theme/theme-import.js.map +0 -1
- package/esm/cli/theme/theme-list.js +0 -25
- package/esm/cli/theme/theme-list.js.map +0 -1
- package/esm/cli/theme/theme.js +0 -14
- package/esm/cli/theme/theme.js.map +0 -1
- package/esm/help/SampleData.js +0 -7
- package/esm/help/SampleData.js.map +0 -1
- package/esm/launch.js +0 -15
- package/esm/launch.js.map +0 -1
- package/esm/loader.js +0 -40
- package/esm/loader.js.map +0 -1
- package/esm/ops/AdminOps.js +0 -936
- package/esm/ops/AdminOps.js.map +0 -1
- package/esm/ops/AgentOps.js +0 -1061
- package/esm/ops/AgentOps.js.map +0 -1
- package/esm/ops/ApplicationOps.js +0 -336
- package/esm/ops/ApplicationOps.js.map +0 -1
- package/esm/ops/AuthenticateOps.js +0 -23
- package/esm/ops/AuthenticateOps.js.map +0 -1
- package/esm/ops/AuthenticationSettingsOps.js +0 -89
- package/esm/ops/AuthenticationSettingsOps.js.map +0 -1
- package/esm/ops/CirclesOfTrustOps.js +0 -265
- package/esm/ops/CirclesOfTrustOps.js.map +0 -1
- package/esm/ops/ConfigOps.js +0 -213
- package/esm/ops/ConfigOps.js.map +0 -1
- package/esm/ops/ConnectionProfileOps.js +0 -132
- package/esm/ops/ConnectionProfileOps.js.map +0 -1
- package/esm/ops/EmailTemplateOps.js +0 -365
- package/esm/ops/EmailTemplateOps.js.map +0 -1
- package/esm/ops/IdmOps.js +0 -303
- package/esm/ops/IdmOps.js.map +0 -1
- package/esm/ops/IdpOps.js +0 -267
- package/esm/ops/IdpOps.js.map +0 -1
- package/esm/ops/JourneyOps.js +0 -815
- package/esm/ops/JourneyOps.js.map +0 -1
- package/esm/ops/LogOps.js +0 -141
- package/esm/ops/LogOps.js.map +0 -1
- package/esm/ops/NodeOps.js +0 -97
- package/esm/ops/NodeOps.js.map +0 -1
- package/esm/ops/OAuth2ClientOps.js +0 -287
- package/esm/ops/OAuth2ClientOps.js.map +0 -1
- package/esm/ops/OrganizationOps.js +0 -20
- package/esm/ops/OrganizationOps.js.map +0 -1
- package/esm/ops/PolicyOps.js +0 -515
- package/esm/ops/PolicyOps.js.map +0 -1
- package/esm/ops/PolicySetOps.js +0 -388
- package/esm/ops/PolicySetOps.js.map +0 -1
- package/esm/ops/RealmOps.js +0 -116
- package/esm/ops/RealmOps.js.map +0 -1
- package/esm/ops/ResourceTypeOps.js +0 -439
- package/esm/ops/ResourceTypeOps.js.map +0 -1
- package/esm/ops/Saml2Ops.js +0 -364
- package/esm/ops/Saml2Ops.js.map +0 -1
- package/esm/ops/Saml2Ops.test_.js.map +0 -1
- package/esm/ops/ScriptOps.js +0 -520
- package/esm/ops/ScriptOps.js.map +0 -1
- package/esm/ops/ServiceOps.js +0 -275
- package/esm/ops/ServiceOps.js.map +0 -1
- package/esm/ops/ThemeOps.js +0 -382
- package/esm/ops/ThemeOps.js.map +0 -1
- package/esm/ops/cloud/AdminFederationOps.js +0 -225
- package/esm/ops/cloud/AdminFederationOps.js.map +0 -1
- package/esm/ops/cloud/SecretsOps.js +0 -471
- package/esm/ops/cloud/SecretsOps.js.map +0 -1
- package/esm/ops/cloud/VariablesOps.js +0 -316
- package/esm/ops/cloud/VariablesOps.js.map +0 -1
- package/esm/ops/templates/GenericExtensionAttributesTemplate.json +0 -412
- package/esm/ops/templates/OAuth2ClientTemplate.json +0 -270
- package/esm/ops/templates/OAuth2TrustedJwtIssuerTemplate.json +0 -38
- package/esm/ops/templates/OrgModelUserAttributesTemplate.json +0 -149
- package/esm/ops/templates/autoaccess/IPAddresses.json +0 -202
- package/esm/ops/templates/autoaccess/UserAgents.json +0 -35
- package/esm/ops/templates/autoaccess/Usernames.json +0 -203
- package/esm/ops/templates/cloud/managed.json +0 -4119
- package/esm/ops/utils/OpsUtils.js +0 -9
- package/esm/ops/utils/OpsUtils.js.map +0 -1
- package/esm/ops/utils/Wordwrap.js +0 -5
- package/esm/ops/utils/Wordwrap.js.map +0 -1
- package/esm/storage/StaticStorage.js +0 -12
- package/esm/storage/StaticStorage.js.map +0 -1
- package/esm/utils/Config.js +0 -200
- package/esm/utils/Config.js.map +0 -1
- package/esm/utils/Console.js +0 -614
- package/esm/utils/Console.js.map +0 -1
- package/esm/utils/Version.js +0 -138
- package/esm/utils/Version.js.map +0 -1
package/esm/ops/ConfigOps.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigOps.js","names":["frodo","FrodoError","state","fs","fse","getFullExportConfig","getFullExportConfigFromDirectory","cleanupProgressIndicators","printError","printMessage","extractScriptToFile","getRealmName","getTypedFilename","titleCase","saveJsonToFile","getFilePath","getWorkingDirectory","utils","stringify","json","exportFullConfiguration","importFullConfiguration","config","exportEverythingToFile","file","includeMeta","options","useStringArrays","noDecode","coords","includeDefault","collectErrors","exportData","fileName","getRealm","length","error","exportEverythingToFiles","extract","meta","baseDirectory","Object","entries","forEach","type","obj","existsSync","mkdirSync","samlData","saml","cot","hosted","metadata","remote","id","value","concat","filename","entityId","samlType","authentication","includes","slice","lastIndexOf","recursive","outputFile","err","name","importEverythingFromFile","reUuidJourneys","reUuidScripts","cleanServices","global","realm","data","importEverythingFromFiles","getDirectory"],"sources":["../../src/ops/ConfigOps.ts"],"sourcesContent":["import { frodo, FrodoError, state } from '@rockcarver/frodo-lib';\nimport {\n FullExportInterface,\n FullExportOptions,\n FullImportOptions,\n} from '@rockcarver/frodo-lib/types/ops/ConfigOps';\nimport { ScriptExportInterface } from '@rockcarver/frodo-lib/types/ops/ScriptOps';\nimport fs from 'fs';\nimport fse from 'fs-extra';\n\nimport {\n getFullExportConfig,\n getFullExportConfigFromDirectory,\n} from '../utils/Config';\nimport {\n cleanupProgressIndicators,\n printError,\n printMessage,\n} from '../utils/Console';\nimport { extractScriptToFile } from './ScriptOps';\n\nconst {\n getRealmName,\n getTypedFilename,\n titleCase,\n saveJsonToFile,\n getFilePath,\n getWorkingDirectory,\n} = frodo.utils;\nconst { stringify } = frodo.utils.json;\nconst { exportFullConfiguration, importFullConfiguration } = frodo.config;\n\n/**\n * Export everything to separate files\n * @param {String} file file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @param {FullExportOptions} options export options\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function exportEverythingToFile(\n file: string,\n includeMeta: boolean = true,\n options: FullExportOptions = {\n useStringArrays: true,\n noDecode: false,\n coords: true,\n includeDefault: false,\n }\n): Promise<boolean> {\n try {\n const collectErrors: Error[] = [];\n const exportData = await exportFullConfiguration(options, collectErrors);\n let fileName = getTypedFilename(\n `${titleCase(getRealmName(state.getRealm()))}`,\n `everything`\n );\n if (file) {\n fileName = file;\n }\n saveJsonToFile(exportData, getFilePath(fileName, true), includeMeta);\n if (collectErrors.length > 0) {\n throw new FrodoError(`Errors occurred during full export`, collectErrors);\n }\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Export everything to separate files\n * @param {boolean} extract Extracts the scripts from the exports into separate files if true\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @param {FullExportOptions} options export options\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function exportEverythingToFiles(\n extract: boolean = false,\n includeMeta: boolean = true,\n options: FullExportOptions = {\n useStringArrays: true,\n noDecode: false,\n coords: true,\n includeDefault: false,\n }\n): Promise<boolean> {\n try {\n const collectErrors: Error[] = [];\n const exportData: FullExportInterface = await exportFullConfiguration(\n options,\n collectErrors\n );\n delete exportData.meta;\n const baseDirectory = getWorkingDirectory(true);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Object.entries(exportData).forEach(([type, obj]: [string, any]) => {\n if (obj) {\n if (!fs.existsSync(`${baseDirectory}/${type}`)) {\n fs.mkdirSync(`${baseDirectory}/${type}`);\n }\n if (type == 'saml') {\n const samlData = {\n saml: {\n cot: {},\n hosted: {},\n metadata: {},\n remote: {},\n },\n };\n if (obj.cot) {\n if (!fs.existsSync(`${baseDirectory}/cot`)) {\n fs.mkdirSync(`${baseDirectory}/cot`);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Object.entries(obj.cot).forEach(([id, value]: [string, any]) => {\n samlData.saml.cot = {\n [id]: value,\n };\n saveJsonToFile(\n samlData,\n `${baseDirectory}/cot/${getTypedFilename(id, 'cot.saml')}`,\n includeMeta\n );\n });\n samlData.saml.cot = {};\n }\n Object.entries(obj.hosted)\n .concat(Object.entries(obj.remote))\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .forEach(([id, value]: [string, any]) => {\n const filename = getTypedFilename(\n value.entityId ? value.entityId : id,\n type\n );\n const samlType = obj.hosted[id] ? 'hosted' : 'remote';\n samlData.saml[samlType][id] = value;\n samlData.saml.metadata = {\n [id]: obj.metadata[id],\n };\n saveJsonToFile(\n samlData,\n `${baseDirectory}/${type}/${filename}`,\n includeMeta\n );\n samlData.saml[samlType] = {};\n });\n } else if (type == 'authentication') {\n const fileName = getTypedFilename(\n `${frodo.utils.getRealmName(state.getRealm())}Realm`,\n 'authentication.settings'\n );\n saveJsonToFile(\n {\n authentication: obj,\n },\n `${baseDirectory}/${type}/${fileName}`,\n includeMeta\n );\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Object.entries(obj).forEach(([id, value]: [string, any]) => {\n if (type == 'config') {\n if (value != null) {\n const filename = `${id}.json`;\n if (filename.includes('/')) {\n fs.mkdirSync(\n `${baseDirectory}/${type}/${filename.slice(\n 0,\n filename.lastIndexOf('/')\n )}`,\n {\n recursive: true,\n }\n );\n }\n fse.outputFile(\n `${baseDirectory}/${type}/${filename}`,\n stringify(value),\n (err) => {\n if (err) {\n return printMessage(\n `ERROR - can't save config ${id} to file - ${err}`,\n 'error'\n );\n }\n }\n );\n }\n } else {\n const filename = getTypedFilename(\n value && value.name && type !== 'emailTemplate'\n ? value.name\n : id,\n type\n );\n if (extract && type == 'script') {\n extractScriptToFile(\n exportData as ScriptExportInterface,\n id,\n type\n );\n }\n saveJsonToFile(\n {\n [type]: {\n [id]: value,\n },\n },\n `${baseDirectory}/${type}/${filename}`,\n includeMeta\n );\n }\n });\n }\n }\n });\n if (collectErrors.length > 0) {\n throw new FrodoError(`Errors occurred during full export`, collectErrors);\n }\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Import everything from a single file\n * @param {string} file The file path\n * @param {FullImportOptions} options import options\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function importEverythingFromFile(\n file: string,\n options: FullImportOptions = {\n reUuidJourneys: false,\n reUuidScripts: false,\n cleanServices: false,\n global: false,\n realm: false,\n includeDefault: false,\n }\n): Promise<boolean> {\n try {\n const data = await getFullExportConfig(file);\n const collectErrors: Error[] = [];\n await importFullConfiguration(data, options, collectErrors);\n if (collectErrors.length > 0) {\n throw new FrodoError(\n `Errors occurred during full config import`,\n collectErrors\n );\n }\n return true;\n } catch (error) {\n cleanupProgressIndicators();\n printError(error);\n }\n return false;\n}\n\n/**\n * Import everything from separate files\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function importEverythingFromFiles(\n options: FullImportOptions = {\n reUuidJourneys: false,\n reUuidScripts: false,\n cleanServices: false,\n global: false,\n realm: false,\n includeDefault: false,\n }\n): Promise<boolean> {\n try {\n const data = await getFullExportConfigFromDirectory(state.getDirectory());\n const collectErrors: Error[] = [];\n await importFullConfiguration(data, options, collectErrors);\n if (collectErrors.length > 0) {\n throw new FrodoError(\n `Errors occurred during full config import`,\n collectErrors\n );\n }\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n"],"mappings":"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"}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { frodo, state } from '@rockcarver/frodo-lib';
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
import { createObjectTable, createTable, debugMessage, failSpinner, printError, printMessage, showSpinner, succeedSpinner } from '../utils/Console';
|
|
4
|
-
const {
|
|
5
|
-
getAccessTokenForServiceAccount
|
|
6
|
-
} = frodo.login;
|
|
7
|
-
const {
|
|
8
|
-
getConnectionProfilesPath,
|
|
9
|
-
getConnectionProfileByHost
|
|
10
|
-
} = frodo.conn;
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* List connection profiles
|
|
14
|
-
* @param {boolean} long Long list format with details
|
|
15
|
-
* @returns {void} void
|
|
16
|
-
*/
|
|
17
|
-
export function listConnectionProfiles(long = false) {
|
|
18
|
-
const filename = getConnectionProfilesPath();
|
|
19
|
-
try {
|
|
20
|
-
const data = fs.readFileSync(filename, 'utf8');
|
|
21
|
-
const connectionsData = JSON.parse(data);
|
|
22
|
-
if (Object.keys(connectionsData).length < 1) {
|
|
23
|
-
printMessage(`No connection profiles in ${filename}`, 'info');
|
|
24
|
-
} else {
|
|
25
|
-
if (long) {
|
|
26
|
-
const table = createTable(['Host', 'Service Account', 'Username', 'Log API Key']);
|
|
27
|
-
Object.keys(connectionsData).forEach(c => {
|
|
28
|
-
table.push([c, connectionsData[c].svcacctName || connectionsData[c].svcacctId, connectionsData[c].username, connectionsData[c].logApiKey]);
|
|
29
|
-
});
|
|
30
|
-
printMessage(table.toString(), 'data');
|
|
31
|
-
} else {
|
|
32
|
-
Object.keys(connectionsData).forEach(c => {
|
|
33
|
-
printMessage(`${c}`, 'data');
|
|
34
|
-
});
|
|
35
|
-
// getUniqueNames(5, Object.keys(connectionsData));
|
|
36
|
-
}
|
|
37
|
-
printMessage('Any unique substring of a saved host can be used as the value for host parameter in all commands', 'info');
|
|
38
|
-
}
|
|
39
|
-
} catch (error) {
|
|
40
|
-
printMessage(`No connection profiles found in ${filename}`, 'error');
|
|
41
|
-
printError(error);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Describe connection profile
|
|
47
|
-
* @param {string} host Host URL or unique substring
|
|
48
|
-
* @param {boolean} showSecrets Whether secrets should be shown in clear text or not
|
|
49
|
-
*/
|
|
50
|
-
export async function describeConnectionProfile(host, showSecrets) {
|
|
51
|
-
debugMessage(`ConnectionProfileOps.describeConnectionProfile: start`);
|
|
52
|
-
const profile = await getConnectionProfileByHost(host);
|
|
53
|
-
if (profile) {
|
|
54
|
-
debugMessage(profile);
|
|
55
|
-
const present = '[present]';
|
|
56
|
-
const jwk = profile.svcacctJwk;
|
|
57
|
-
if (!showSecrets) {
|
|
58
|
-
if (profile.password) profile.password = present;
|
|
59
|
-
if (profile.logApiSecret) profile.logApiSecret = present;
|
|
60
|
-
if (profile.svcacctJwk) profile['svcacctJwk'] = present;
|
|
61
|
-
}
|
|
62
|
-
if (!profile.username) {
|
|
63
|
-
delete profile.username;
|
|
64
|
-
delete profile.password;
|
|
65
|
-
}
|
|
66
|
-
if (!profile.logApiKey) {
|
|
67
|
-
delete profile.logApiKey;
|
|
68
|
-
delete profile.logApiSecret;
|
|
69
|
-
}
|
|
70
|
-
if (!profile.svcacctId) {
|
|
71
|
-
delete profile.svcacctId;
|
|
72
|
-
delete profile.svcacctJwk;
|
|
73
|
-
delete profile.svcacctName;
|
|
74
|
-
delete profile.svcacctScope;
|
|
75
|
-
}
|
|
76
|
-
if (!profile.svcacctScope) {
|
|
77
|
-
delete profile.svcacctScope;
|
|
78
|
-
}
|
|
79
|
-
if (showSecrets && jwk) {
|
|
80
|
-
profile['svcacctJwk'] = 'see below';
|
|
81
|
-
}
|
|
82
|
-
if (!profile.authenticationService) {
|
|
83
|
-
delete profile.authenticationService;
|
|
84
|
-
}
|
|
85
|
-
const keyMap = {
|
|
86
|
-
tenant: 'Host',
|
|
87
|
-
deploymentType: 'Deployment Type',
|
|
88
|
-
username: 'Username',
|
|
89
|
-
password: 'Password',
|
|
90
|
-
logApiKey: 'Log API Key',
|
|
91
|
-
logApiSecret: 'Log API Secret',
|
|
92
|
-
authenticationService: 'Authentication Service',
|
|
93
|
-
authenticationHeaderOverrides: 'Authentication Header Overrides',
|
|
94
|
-
svcacctName: 'Service Account Name',
|
|
95
|
-
svcacctId: 'Service Account Id',
|
|
96
|
-
svcacctJwk: 'Service Account JWK',
|
|
97
|
-
svcacctScope: 'Service Account Scope'
|
|
98
|
-
};
|
|
99
|
-
const table = createObjectTable(profile, keyMap);
|
|
100
|
-
printMessage(table.toString(), 'data');
|
|
101
|
-
if (showSecrets && jwk) {
|
|
102
|
-
printMessage(JSON.stringify(jwk), 'data');
|
|
103
|
-
}
|
|
104
|
-
} else {
|
|
105
|
-
printMessage(`No connection profile ${host} found`);
|
|
106
|
-
}
|
|
107
|
-
debugMessage(`ConnectionProfileOps.describeConnectionProfile: end`);
|
|
108
|
-
}
|
|
109
|
-
export async function addExistingServiceAccount(serviceAccountId, privateKeyFile, validate) {
|
|
110
|
-
try {
|
|
111
|
-
const data = fs.readFileSync(privateKeyFile);
|
|
112
|
-
const jwk = JSON.parse(data.toString());
|
|
113
|
-
if (validate) {
|
|
114
|
-
showSpinner(`Validating service account ${serviceAccountId}...`);
|
|
115
|
-
const token = await getAccessTokenForServiceAccount(serviceAccountId, jwk);
|
|
116
|
-
if (token === null) {
|
|
117
|
-
failSpinner(`Failed to validate service account ${serviceAccountId}.`);
|
|
118
|
-
return false;
|
|
119
|
-
} else {
|
|
120
|
-
succeedSpinner(`Successfully validated service account ${serviceAccountId}.`);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
state.setServiceAccountId(serviceAccountId);
|
|
124
|
-
state.setServiceAccountJwk(jwk);
|
|
125
|
-
return true;
|
|
126
|
-
} catch (error) {
|
|
127
|
-
failSpinner(`Failed to validate service account ${serviceAccountId}: ${error}.`);
|
|
128
|
-
printError(error);
|
|
129
|
-
}
|
|
130
|
-
return false;
|
|
131
|
-
}
|
|
132
|
-
//# sourceMappingURL=ConnectionProfileOps.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ConnectionProfileOps.js","names":["frodo","state","fs","createObjectTable","createTable","debugMessage","failSpinner","printError","printMessage","showSpinner","succeedSpinner","getAccessTokenForServiceAccount","login","getConnectionProfilesPath","getConnectionProfileByHost","conn","listConnectionProfiles","long","filename","data","readFileSync","connectionsData","JSON","parse","Object","keys","length","table","forEach","c","push","svcacctName","svcacctId","username","logApiKey","toString","error","describeConnectionProfile","host","showSecrets","profile","present","jwk","svcacctJwk","password","logApiSecret","svcacctScope","authenticationService","keyMap","tenant","deploymentType","authenticationHeaderOverrides","stringify","addExistingServiceAccount","serviceAccountId","privateKeyFile","validate","token","setServiceAccountId","setServiceAccountJwk"],"sources":["../../src/ops/ConnectionProfileOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport fs from 'fs';\n\nimport {\n createObjectTable,\n createTable,\n debugMessage,\n failSpinner,\n printError,\n printMessage,\n showSpinner,\n succeedSpinner,\n} from '../utils/Console';\n\nconst { getAccessTokenForServiceAccount } = frodo.login;\nconst { getConnectionProfilesPath, getConnectionProfileByHost } = frodo.conn;\n\n/**\n * List connection profiles\n * @param {boolean} long Long list format with details\n * @returns {void} void\n */\nexport function listConnectionProfiles(long: boolean = false): void {\n const filename = getConnectionProfilesPath();\n try {\n const data = fs.readFileSync(filename, 'utf8');\n const connectionsData = JSON.parse(data);\n if (Object.keys(connectionsData).length < 1) {\n printMessage(`No connection profiles in ${filename}`, 'info');\n } else {\n if (long) {\n const table = createTable([\n 'Host',\n 'Service Account',\n 'Username',\n 'Log API Key',\n ]);\n Object.keys(connectionsData).forEach((c) => {\n table.push([\n c,\n connectionsData[c].svcacctName || connectionsData[c].svcacctId,\n connectionsData[c].username,\n connectionsData[c].logApiKey,\n ]);\n });\n printMessage(table.toString(), 'data');\n } else {\n Object.keys(connectionsData).forEach((c) => {\n printMessage(`${c}`, 'data');\n });\n // getUniqueNames(5, Object.keys(connectionsData));\n }\n printMessage(\n 'Any unique substring of a saved host can be used as the value for host parameter in all commands',\n 'info'\n );\n }\n } catch (error) {\n printMessage(`No connection profiles found in ${filename}`, 'error');\n printError(error);\n }\n}\n\n/**\n * Describe connection profile\n * @param {string} host Host URL or unique substring\n * @param {boolean} showSecrets Whether secrets should be shown in clear text or not\n */\nexport async function describeConnectionProfile(\n host: string,\n showSecrets: boolean\n) {\n debugMessage(`ConnectionProfileOps.describeConnectionProfile: start`);\n const profile = await getConnectionProfileByHost(host);\n if (profile) {\n debugMessage(profile);\n const present = '[present]';\n const jwk = profile.svcacctJwk;\n if (!showSecrets) {\n if (profile.password) profile.password = present;\n if (profile.logApiSecret) profile.logApiSecret = present;\n if (profile.svcacctJwk) (profile as unknown)['svcacctJwk'] = present;\n }\n if (!profile.username) {\n delete profile.username;\n delete profile.password;\n }\n if (!profile.logApiKey) {\n delete profile.logApiKey;\n delete profile.logApiSecret;\n }\n if (!profile.svcacctId) {\n delete profile.svcacctId;\n delete profile.svcacctJwk;\n delete profile.svcacctName;\n delete profile.svcacctScope;\n }\n if (!profile.svcacctScope) {\n delete profile.svcacctScope;\n }\n if (showSecrets && jwk) {\n (profile as unknown)['svcacctJwk'] = 'see below';\n }\n if (!profile.authenticationService) {\n delete profile.authenticationService;\n }\n const keyMap = {\n tenant: 'Host',\n deploymentType: 'Deployment Type',\n username: 'Username',\n password: 'Password',\n logApiKey: 'Log API Key',\n logApiSecret: 'Log API Secret',\n authenticationService: 'Authentication Service',\n authenticationHeaderOverrides: 'Authentication Header Overrides',\n svcacctName: 'Service Account Name',\n svcacctId: 'Service Account Id',\n svcacctJwk: 'Service Account JWK',\n svcacctScope: 'Service Account Scope',\n };\n const table = createObjectTable(profile, keyMap);\n printMessage(table.toString(), 'data');\n if (showSecrets && jwk) {\n printMessage(JSON.stringify(jwk), 'data');\n }\n } else {\n printMessage(`No connection profile ${host} found`);\n }\n debugMessage(`ConnectionProfileOps.describeConnectionProfile: end`);\n}\n\nexport async function addExistingServiceAccount(\n serviceAccountId: string,\n privateKeyFile: string,\n validate: boolean\n): Promise<boolean> {\n try {\n const data = fs.readFileSync(privateKeyFile);\n const jwk = JSON.parse(data.toString());\n if (validate) {\n showSpinner(`Validating service account ${serviceAccountId}...`);\n const token = await getAccessTokenForServiceAccount(\n serviceAccountId,\n jwk\n );\n if (token === null) {\n failSpinner(`Failed to validate service account ${serviceAccountId}.`);\n return false;\n } else {\n succeedSpinner(\n `Successfully validated service account ${serviceAccountId}.`\n );\n }\n }\n state.setServiceAccountId(serviceAccountId);\n state.setServiceAccountJwk(jwk);\n return true;\n } catch (error) {\n failSpinner(\n `Failed to validate service account ${serviceAccountId}: ${error}.`\n );\n printError(error);\n }\n return false;\n}\n"],"mappings":"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"}
|
|
@@ -1,365 +0,0 @@
|
|
|
1
|
-
import { frodo, FrodoError } from '@rockcarver/frodo-lib';
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
import { createProgressIndicator, createTable, debugMessage, printError, printMessage, stopProgressIndicator, updateProgressIndicator } from '../utils/Console';
|
|
5
|
-
import { cloneDeep } from './utils/OpsUtils';
|
|
6
|
-
import wordwrap from './utils/Wordwrap';
|
|
7
|
-
const {
|
|
8
|
-
validateImport,
|
|
9
|
-
getTypedFilename,
|
|
10
|
-
saveJsonToFile,
|
|
11
|
-
getFilePath,
|
|
12
|
-
getWorkingDirectory
|
|
13
|
-
} = frodo.utils;
|
|
14
|
-
const {
|
|
15
|
-
EMAIL_TEMPLATE_TYPE,
|
|
16
|
-
readEmailTemplates,
|
|
17
|
-
readEmailTemplate,
|
|
18
|
-
exportEmailTemplates,
|
|
19
|
-
updateEmailTemplate,
|
|
20
|
-
importEmailTemplates
|
|
21
|
-
} = frodo.email.template;
|
|
22
|
-
const EMAIL_TEMPLATE_FILE_TYPE = 'template.email';
|
|
23
|
-
const regexEmailTemplateType = new RegExp(`${EMAIL_TEMPLATE_TYPE}/`, 'g');
|
|
24
|
-
|
|
25
|
-
// use a function vs a template variable to avoid problems in loops
|
|
26
|
-
function getFileDataTemplate() {
|
|
27
|
-
return {
|
|
28
|
-
meta: {},
|
|
29
|
-
emailTemplate: {}
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Get a one-line description of the email template
|
|
35
|
-
* @param {EmailTemplateSkeleton} templateObj email template object to describe
|
|
36
|
-
* @returns {string} a one-line description
|
|
37
|
-
*/
|
|
38
|
-
export function getOneLineDescription(templateObj) {
|
|
39
|
-
const description = `[${templateObj._id.split('/')[1]['brightCyan']}] ${templateObj.displayName ? templateObj.displayName : ''} - ${templateObj.defaultLocale ? templateObj.subject[templateObj.defaultLocale] : Object.values(templateObj.subject)[0]}`;
|
|
40
|
-
return description;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Get markdown table header
|
|
45
|
-
* @returns {string} markdown table header
|
|
46
|
-
*/
|
|
47
|
-
export function getTableHeaderMd() {
|
|
48
|
-
let markdown = '';
|
|
49
|
-
markdown += '| Display Name | Locale(s) | Subject | Id |\n';
|
|
50
|
-
markdown += '| ------------ | --------- | ------- | ---|';
|
|
51
|
-
return markdown;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Get a table-row of the email template in markdown
|
|
56
|
-
* @param {EmailTemplateSkeleton} templateObj email template object to describe
|
|
57
|
-
* @returns {string} a table-row of the email template in markdown
|
|
58
|
-
*/
|
|
59
|
-
export function getTableRowMd(templateObj) {
|
|
60
|
-
const templateId = templateObj._id.replace(`${EMAIL_TEMPLATE_TYPE}/`, '');
|
|
61
|
-
const locales = `${templateObj.defaultLocale}${Object.keys(templateObj.subject).length > 1 ? ` (${Object.keys(templateObj.subject).filter(locale => locale !== templateObj.defaultLocale).join(',')})` : ''}`;
|
|
62
|
-
const row = `| ${templateObj.name ? templateObj.name : templateId} | ${locales} | ${templateObj.subject[templateObj.defaultLocale]} | \`${templateId}\` |`;
|
|
63
|
-
return row;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* List email templates
|
|
68
|
-
* @param {boolean} long Long list format with details
|
|
69
|
-
* @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise
|
|
70
|
-
*/
|
|
71
|
-
export async function listEmailTemplates(long = false) {
|
|
72
|
-
let emailTemplates = [];
|
|
73
|
-
try {
|
|
74
|
-
emailTemplates = await readEmailTemplates();
|
|
75
|
-
} catch (error) {
|
|
76
|
-
printError(error);
|
|
77
|
-
return false;
|
|
78
|
-
}
|
|
79
|
-
emailTemplates.sort((a, b) => a._id.localeCompare(b._id));
|
|
80
|
-
if (!long) {
|
|
81
|
-
for (const [, emailTemplate] of emailTemplates.entries()) {
|
|
82
|
-
printMessage(`${emailTemplate._id.replace(`${EMAIL_TEMPLATE_TYPE}/`, '')}`, 'data');
|
|
83
|
-
}
|
|
84
|
-
} else {
|
|
85
|
-
const table = createTable(['Id'['brightCyan'], 'Name'['brightCyan'], 'Status'['brightCyan'], 'Locale(s)'['brightCyan'], 'From'['brightCyan'], 'Subject'['brightCyan']]);
|
|
86
|
-
for (const emailTemplate of emailTemplates) {
|
|
87
|
-
table.push([
|
|
88
|
-
// Id
|
|
89
|
-
`${emailTemplate._id.replace(`${EMAIL_TEMPLATE_TYPE}/`, '')}`,
|
|
90
|
-
// Name
|
|
91
|
-
`${emailTemplate.displayName ? emailTemplate.displayName : ''}`,
|
|
92
|
-
// Status
|
|
93
|
-
emailTemplate.enabled === false ? 'disabled'['brightRed'] : 'enabled'['brightGreen'],
|
|
94
|
-
// Locale(s)
|
|
95
|
-
`${emailTemplate.defaultLocale}${Object.keys(emailTemplate.subject).length > 1 ? ` (${Object.keys(emailTemplate.subject).filter(locale => locale !== emailTemplate.defaultLocale).join(',')})` : ''}`,
|
|
96
|
-
// From
|
|
97
|
-
`${emailTemplate.from ? emailTemplate.from : ''}`,
|
|
98
|
-
// Subject
|
|
99
|
-
wordwrap(emailTemplate.subject[emailTemplate.defaultLocale], 40)]);
|
|
100
|
-
}
|
|
101
|
-
printMessage(table.toString(), 'data');
|
|
102
|
-
}
|
|
103
|
-
return true;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Export single email template to a file
|
|
108
|
-
* @param {string} templateId email template id to export
|
|
109
|
-
* @param {string} file filename where to export the template data
|
|
110
|
-
* @param {boolean} includeMeta true to include metadata, false otherwise. Default: true
|
|
111
|
-
* @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise
|
|
112
|
-
*/
|
|
113
|
-
export async function exportEmailTemplateToFile(templateId, file, includeMeta = true) {
|
|
114
|
-
let indicatorId;
|
|
115
|
-
try {
|
|
116
|
-
let fileName = file;
|
|
117
|
-
if (!fileName) {
|
|
118
|
-
fileName = getTypedFilename(templateId, EMAIL_TEMPLATE_FILE_TYPE);
|
|
119
|
-
}
|
|
120
|
-
const filePath = getFilePath(fileName, true);
|
|
121
|
-
indicatorId = createProgressIndicator('determinate', 1, `Exporting ${templateId}`);
|
|
122
|
-
const templateData = await readEmailTemplate(templateId);
|
|
123
|
-
updateProgressIndicator(indicatorId, `Writing file ${filePath}`);
|
|
124
|
-
const fileData = getFileDataTemplate();
|
|
125
|
-
fileData.emailTemplate[templateId] = templateData;
|
|
126
|
-
saveJsonToFile(fileData, filePath, includeMeta);
|
|
127
|
-
stopProgressIndicator(indicatorId, `Exported ${templateId['brightCyan']} to ${filePath['brightCyan']}.`);
|
|
128
|
-
return true;
|
|
129
|
-
} catch (error) {
|
|
130
|
-
stopProgressIndicator(indicatorId, `${error}`);
|
|
131
|
-
printError(error);
|
|
132
|
-
}
|
|
133
|
-
return false;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Export all email templates to file
|
|
138
|
-
* @param {string} file optional filename
|
|
139
|
-
* @param {boolean} includeMeta true to include metadata, false otherwise. Default: true
|
|
140
|
-
* @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise
|
|
141
|
-
*/
|
|
142
|
-
export async function exportEmailTemplatesToFile(file, includeMeta = true) {
|
|
143
|
-
try {
|
|
144
|
-
let fileName = file;
|
|
145
|
-
if (!fileName) {
|
|
146
|
-
fileName = getTypedFilename(`allEmailTemplates`, EMAIL_TEMPLATE_FILE_TYPE);
|
|
147
|
-
}
|
|
148
|
-
const filePath = getFilePath(fileName, true);
|
|
149
|
-
const exportData = await exportEmailTemplates();
|
|
150
|
-
saveJsonToFile(exportData, filePath, includeMeta);
|
|
151
|
-
return true;
|
|
152
|
-
} catch (error) {
|
|
153
|
-
printError(error);
|
|
154
|
-
}
|
|
155
|
-
return false;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Export all email templates to separate files
|
|
160
|
-
* @param {boolean} includeMeta true to include metadata, false otherwise. Default: true
|
|
161
|
-
* @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise
|
|
162
|
-
*/
|
|
163
|
-
export async function exportEmailTemplatesToFiles(includeMeta = true) {
|
|
164
|
-
let indicatorId;
|
|
165
|
-
try {
|
|
166
|
-
const exportData = Object.entries((await exportEmailTemplates()).emailTemplate);
|
|
167
|
-
indicatorId = createProgressIndicator('determinate', exportData.length, 'Writing email templates');
|
|
168
|
-
for (const [templateId, template] of exportData) {
|
|
169
|
-
const fileName = getTypedFilename(templateId, EMAIL_TEMPLATE_FILE_TYPE);
|
|
170
|
-
const fileData = getFileDataTemplate();
|
|
171
|
-
updateProgressIndicator(indicatorId, `Exporting ${templateId}`);
|
|
172
|
-
fileData.emailTemplate[templateId] = template;
|
|
173
|
-
saveJsonToFile(fileData, getFilePath(fileName, true), includeMeta);
|
|
174
|
-
}
|
|
175
|
-
stopProgressIndicator(indicatorId, `${exportData.length} templates written.`);
|
|
176
|
-
return true;
|
|
177
|
-
} catch (error) {
|
|
178
|
-
stopProgressIndicator(indicatorId, `${error}`);
|
|
179
|
-
printError(error);
|
|
180
|
-
}
|
|
181
|
-
return false;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Import email template by id from file
|
|
186
|
-
* @param {string} templateId email template id
|
|
187
|
-
* @param {string} file optional filename
|
|
188
|
-
* @param {boolean} raw import raw data file lacking frodo export envelop
|
|
189
|
-
* @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise
|
|
190
|
-
*/
|
|
191
|
-
export async function importEmailTemplateFromFile(templateId, file, raw = false) {
|
|
192
|
-
templateId = templateId.replaceAll(`${EMAIL_TEMPLATE_TYPE}/`, '');
|
|
193
|
-
const filePath = getFilePath(file);
|
|
194
|
-
try {
|
|
195
|
-
const data = fs.readFileSync(filePath, 'utf8');
|
|
196
|
-
const fileData = JSON.parse(data);
|
|
197
|
-
const indicatorId = createProgressIndicator('determinate', 1, `Importing ${templateId}`);
|
|
198
|
-
if (fileData.emailTemplate && fileData.emailTemplate[templateId] || raw && getTemplateIdFromFileName(file) === templateId) {
|
|
199
|
-
try {
|
|
200
|
-
const emailTemplateData = raw ? s2sConvert(fileData) : fileData.emailTemplate[templateId];
|
|
201
|
-
await updateEmailTemplate(templateId, emailTemplateData);
|
|
202
|
-
updateProgressIndicator(indicatorId, `Importing ${templateId}`);
|
|
203
|
-
stopProgressIndicator(indicatorId, `Imported ${templateId}`);
|
|
204
|
-
return true;
|
|
205
|
-
} catch (error) {
|
|
206
|
-
stopProgressIndicator(indicatorId, `${error}`);
|
|
207
|
-
printError(error);
|
|
208
|
-
}
|
|
209
|
-
} else {
|
|
210
|
-
stopProgressIndicator(indicatorId, `Email template ${templateId} not found in ${filePath}!`);
|
|
211
|
-
printMessage(`Email template ${templateId} not found in ${filePath}!`, 'error');
|
|
212
|
-
}
|
|
213
|
-
} catch (error) {
|
|
214
|
-
printError(error);
|
|
215
|
-
}
|
|
216
|
-
return false;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Import all email templates from file
|
|
221
|
-
* @param {string} file optional filename
|
|
222
|
-
* @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise
|
|
223
|
-
*/
|
|
224
|
-
export async function importEmailTemplatesFromFile(file) {
|
|
225
|
-
const filePath = getFilePath(file);
|
|
226
|
-
const indicatorId = createProgressIndicator('indeterminate', 0, `Importing email templates from ${filePath}...`);
|
|
227
|
-
try {
|
|
228
|
-
const data = fs.readFileSync(filePath, 'utf8');
|
|
229
|
-
const fileData = JSON.parse(data);
|
|
230
|
-
await importEmailTemplates(fileData);
|
|
231
|
-
stopProgressIndicator(indicatorId, `Successfully imported email templates from ${filePath}.`, 'success');
|
|
232
|
-
return true;
|
|
233
|
-
} catch (error) {
|
|
234
|
-
stopProgressIndicator(indicatorId, `Error importing email templates from ${filePath}.`, 'fail');
|
|
235
|
-
printError(error);
|
|
236
|
-
}
|
|
237
|
-
return false;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* Helper function to get email template id from file name
|
|
242
|
-
* @param {string} file file name
|
|
243
|
-
* @returns {string} email template id/name
|
|
244
|
-
*/
|
|
245
|
-
function getTemplateIdFromFileName(file) {
|
|
246
|
-
debugMessage(`cli.EmailTemplateOps.getTemplateIdFromFileName: file=${file}`);
|
|
247
|
-
const basename = path.basename(file);
|
|
248
|
-
const keys = basename.split('-');
|
|
249
|
-
if (keys[0] !== EMAIL_TEMPLATE_TYPE || keys.length <= 1) throw new FrodoError(`Filename does not indicate a raw email template: ${file}`);
|
|
250
|
-
const templateId = keys[1].split('.')[0];
|
|
251
|
-
debugMessage(`cli.EmailTemplateOps.getTemplateIdFromFileName: templateId=${templateId}`);
|
|
252
|
-
return templateId;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
/**
|
|
256
|
-
* Convert template for s2s purposes (software-to-saas migration)
|
|
257
|
-
* @param {EmailTemplateSkeleton} templateData template object
|
|
258
|
-
* @returns {EmailTemplateSkeleton} converted template object
|
|
259
|
-
*/
|
|
260
|
-
function s2sConvert(templateData) {
|
|
261
|
-
if (templateData.message && !templateData.html) {
|
|
262
|
-
const convertedData = cloneDeep(templateData);
|
|
263
|
-
convertedData.html = cloneDeep(templateData.message);
|
|
264
|
-
debugMessage(`cli.EmailTemplateOps.s2sConvert: templateData:`);
|
|
265
|
-
debugMessage(templateData);
|
|
266
|
-
debugMessage(`cli.EmailTemplateOps.s2sConvert: convertedData:`);
|
|
267
|
-
debugMessage(convertedData);
|
|
268
|
-
return convertedData;
|
|
269
|
-
}
|
|
270
|
-
return templateData;
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
/**
|
|
274
|
-
* Import all email templates from separate files
|
|
275
|
-
* @param {boolean} raw import raw data file lacking frodo export envelop
|
|
276
|
-
* @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise
|
|
277
|
-
*/
|
|
278
|
-
export async function importEmailTemplatesFromFiles(raw = false) {
|
|
279
|
-
const names = fs.readdirSync(getWorkingDirectory());
|
|
280
|
-
const jsonFiles = names.filter(name => raw ? name.startsWith(`${EMAIL_TEMPLATE_TYPE}-`) && name.endsWith(`.json`) : name.toLowerCase().endsWith(`${EMAIL_TEMPLATE_FILE_TYPE}.json`)).map(name => getFilePath(name));
|
|
281
|
-
const indicatorId = createProgressIndicator('determinate', jsonFiles.length, 'Importing email templates...');
|
|
282
|
-
let total = 0;
|
|
283
|
-
let totalErrors = 0;
|
|
284
|
-
for (const file of jsonFiles) {
|
|
285
|
-
const data = fs.readFileSync(file, 'utf8');
|
|
286
|
-
const fileData = JSON.parse(data);
|
|
287
|
-
if (raw && file.startsWith('emailTemplate-') || validateImport(fileData.meta)) {
|
|
288
|
-
let errors = 0;
|
|
289
|
-
if (raw) {
|
|
290
|
-
total++;
|
|
291
|
-
const templateId = getTemplateIdFromFileName(file);
|
|
292
|
-
try {
|
|
293
|
-
const templateData = s2sConvert(fileData);
|
|
294
|
-
await updateEmailTemplate(templateId, templateData);
|
|
295
|
-
} catch (error) {
|
|
296
|
-
errors += 1;
|
|
297
|
-
printError(error);
|
|
298
|
-
}
|
|
299
|
-
} else {
|
|
300
|
-
total += Object.keys(fileData.emailTemplate).length;
|
|
301
|
-
for (const id in fileData.emailTemplate) {
|
|
302
|
-
if ({}.hasOwnProperty.call(fileData.emailTemplate, id)) {
|
|
303
|
-
const templateId = id.replace(regexEmailTemplateType, '');
|
|
304
|
-
try {
|
|
305
|
-
await updateEmailTemplate(templateId, fileData.emailTemplate[templateId]);
|
|
306
|
-
} catch (error) {
|
|
307
|
-
errors += 1;
|
|
308
|
-
printError(error);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
totalErrors += errors;
|
|
314
|
-
updateProgressIndicator(indicatorId, `Imported ${file}`);
|
|
315
|
-
} else {
|
|
316
|
-
printMessage(`Validation of ${file} failed!`, 'error');
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
stopProgressIndicator(indicatorId, `Imported ${total - totalErrors} of ${total} email template(s) from ${jsonFiles.length} file(s).`);
|
|
320
|
-
if (totalErrors === 0) return true;
|
|
321
|
-
return false;
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
/**
|
|
325
|
-
* Import first email template from file
|
|
326
|
-
* @param {string} file optional filename
|
|
327
|
-
* @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise
|
|
328
|
-
*/
|
|
329
|
-
export async function importFirstEmailTemplateFromFile(file, raw = false) {
|
|
330
|
-
let indicatorId;
|
|
331
|
-
try {
|
|
332
|
-
const data = fs.readFileSync(getFilePath(file), 'utf8');
|
|
333
|
-
const fileData = JSON.parse(data);
|
|
334
|
-
indicatorId = createProgressIndicator('indeterminate', 0, `Importing first email template`);
|
|
335
|
-
if (raw) {
|
|
336
|
-
try {
|
|
337
|
-
const templateId = getTemplateIdFromFileName(file);
|
|
338
|
-
const templateData = s2sConvert(fileData);
|
|
339
|
-
await updateEmailTemplate(templateId, templateData);
|
|
340
|
-
stopProgressIndicator(indicatorId, `Imported ${templateId}`, 'success');
|
|
341
|
-
return true;
|
|
342
|
-
} catch (error) {
|
|
343
|
-
stopProgressIndicator(indicatorId, `Error importing email template: ${error}`, 'fail');
|
|
344
|
-
printError(error);
|
|
345
|
-
}
|
|
346
|
-
} else {
|
|
347
|
-
for (const id of Object.keys(fileData.emailTemplate)) {
|
|
348
|
-
try {
|
|
349
|
-
await updateEmailTemplate(id.replace(regexEmailTemplateType, ''), fileData.emailTemplate[id]);
|
|
350
|
-
stopProgressIndicator(indicatorId, `Imported ${id}`, 'success');
|
|
351
|
-
return true;
|
|
352
|
-
} catch (error) {
|
|
353
|
-
stopProgressIndicator(indicatorId, `Error importing ${id}`, 'fail');
|
|
354
|
-
printError(error);
|
|
355
|
-
}
|
|
356
|
-
break;
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
} catch (error) {
|
|
360
|
-
stopProgressIndicator(indicatorId, `Error importing first email template`, 'fail');
|
|
361
|
-
printError(error);
|
|
362
|
-
}
|
|
363
|
-
return false;
|
|
364
|
-
}
|
|
365
|
-
//# sourceMappingURL=EmailTemplateOps.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EmailTemplateOps.js","names":["frodo","FrodoError","fs","path","createProgressIndicator","createTable","debugMessage","printError","printMessage","stopProgressIndicator","updateProgressIndicator","cloneDeep","wordwrap","validateImport","getTypedFilename","saveJsonToFile","getFilePath","getWorkingDirectory","utils","EMAIL_TEMPLATE_TYPE","readEmailTemplates","readEmailTemplate","exportEmailTemplates","updateEmailTemplate","importEmailTemplates","email","template","EMAIL_TEMPLATE_FILE_TYPE","regexEmailTemplateType","RegExp","getFileDataTemplate","meta","emailTemplate","getOneLineDescription","templateObj","description","_id","split","displayName","defaultLocale","subject","Object","values","getTableHeaderMd","markdown","getTableRowMd","templateId","replace","locales","keys","length","filter","locale","join","row","name","listEmailTemplates","long","emailTemplates","error","sort","a","b","localeCompare","entries","table","push","enabled","from","toString","exportEmailTemplateToFile","file","includeMeta","indicatorId","fileName","filePath","templateData","fileData","exportEmailTemplatesToFile","exportData","exportEmailTemplatesToFiles","importEmailTemplateFromFile","raw","replaceAll","data","readFileSync","JSON","parse","getTemplateIdFromFileName","emailTemplateData","s2sConvert","importEmailTemplatesFromFile","basename","message","html","convertedData","importEmailTemplatesFromFiles","names","readdirSync","jsonFiles","startsWith","endsWith","toLowerCase","map","total","totalErrors","errors","id","hasOwnProperty","call","importFirstEmailTemplateFromFile"],"sources":["../../src/ops/EmailTemplateOps.ts"],"sourcesContent":["import { frodo, FrodoError } from '@rockcarver/frodo-lib';\nimport { EmailTemplateSkeleton } from '@rockcarver/frodo-lib/types/ops/EmailTemplateOps';\nimport fs from 'fs';\nimport path from 'path';\n\nimport {\n createProgressIndicator,\n createTable,\n debugMessage,\n printError,\n printMessage,\n stopProgressIndicator,\n updateProgressIndicator,\n} from '../utils/Console';\nimport { cloneDeep } from './utils/OpsUtils';\nimport wordwrap from './utils/Wordwrap';\n\nconst {\n validateImport,\n getTypedFilename,\n saveJsonToFile,\n getFilePath,\n getWorkingDirectory,\n} = frodo.utils;\nconst {\n EMAIL_TEMPLATE_TYPE,\n readEmailTemplates,\n readEmailTemplate,\n exportEmailTemplates,\n updateEmailTemplate,\n importEmailTemplates,\n} = frodo.email.template;\n\nconst EMAIL_TEMPLATE_FILE_TYPE = 'template.email';\n\nconst regexEmailTemplateType = new RegExp(`${EMAIL_TEMPLATE_TYPE}/`, 'g');\n\n// use a function vs a template variable to avoid problems in loops\nfunction getFileDataTemplate() {\n return {\n meta: {},\n emailTemplate: {},\n };\n}\n\n/**\n * Get a one-line description of the email template\n * @param {EmailTemplateSkeleton} templateObj email template object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(\n templateObj: EmailTemplateSkeleton\n): string {\n const description = `[${templateObj._id.split('/')[1]['brightCyan']}] ${\n templateObj.displayName ? templateObj.displayName : ''\n } - ${\n templateObj.defaultLocale\n ? templateObj.subject[templateObj.defaultLocale]\n : Object.values(templateObj.subject)[0]\n }`;\n return description;\n}\n\n/**\n * Get markdown table header\n * @returns {string} markdown table header\n */\nexport function getTableHeaderMd(): string {\n let markdown = '';\n markdown += '| Display Name | Locale(s) | Subject | Id |\\n';\n markdown += '| ------------ | --------- | ------- | ---|';\n return markdown;\n}\n\n/**\n * Get a table-row of the email template in markdown\n * @param {EmailTemplateSkeleton} templateObj email template object to describe\n * @returns {string} a table-row of the email template in markdown\n */\nexport function getTableRowMd(templateObj: EmailTemplateSkeleton): string {\n const templateId = templateObj._id.replace(`${EMAIL_TEMPLATE_TYPE}/`, '');\n const locales = `${templateObj.defaultLocale}${\n Object.keys(templateObj.subject).length > 1\n ? ` (${Object.keys(templateObj.subject)\n .filter((locale) => locale !== templateObj.defaultLocale)\n .join(',')})`\n : ''\n }`;\n const row = `| ${\n templateObj.name ? templateObj.name : templateId\n } | ${locales} | ${\n templateObj.subject[templateObj.defaultLocale]\n } | \\`${templateId}\\` |`;\n return row;\n}\n\n/**\n * List email templates\n * @param {boolean} long Long list format with details\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function listEmailTemplates(\n long: boolean = false\n): Promise<boolean> {\n let emailTemplates = [];\n try {\n emailTemplates = await readEmailTemplates();\n } catch (error) {\n printError(error);\n return false;\n }\n emailTemplates.sort((a, b) => a._id.localeCompare(b._id));\n if (!long) {\n for (const [, emailTemplate] of emailTemplates.entries()) {\n printMessage(\n `${emailTemplate._id.replace(`${EMAIL_TEMPLATE_TYPE}/`, '')}`,\n 'data'\n );\n }\n } else {\n const table = createTable([\n 'Id'['brightCyan'],\n 'Name'['brightCyan'],\n 'Status'['brightCyan'],\n 'Locale(s)'['brightCyan'],\n 'From'['brightCyan'],\n 'Subject'['brightCyan'],\n ]);\n for (const emailTemplate of emailTemplates) {\n table.push([\n // Id\n `${emailTemplate._id.replace(`${EMAIL_TEMPLATE_TYPE}/`, '')}`,\n // Name\n `${emailTemplate.displayName ? emailTemplate.displayName : ''}`,\n // Status\n emailTemplate.enabled === false\n ? 'disabled'['brightRed']\n : 'enabled'['brightGreen'],\n // Locale(s)\n `${emailTemplate.defaultLocale}${\n Object.keys(emailTemplate.subject).length > 1\n ? ` (${Object.keys(emailTemplate.subject)\n .filter((locale) => locale !== emailTemplate.defaultLocale)\n .join(',')})`\n : ''\n }`,\n // From\n `${emailTemplate.from ? emailTemplate.from : ''}`,\n // Subject\n wordwrap(emailTemplate.subject[emailTemplate.defaultLocale], 40),\n ]);\n }\n printMessage(table.toString(), 'data');\n }\n return true;\n}\n\n/**\n * Export single email template to a file\n * @param {string} templateId email template id to export\n * @param {string} file filename where to export the template data\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function exportEmailTemplateToFile(\n templateId: string,\n file: string,\n includeMeta: boolean = true\n): Promise<boolean> {\n let indicatorId: string;\n try {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(templateId, EMAIL_TEMPLATE_FILE_TYPE);\n }\n const filePath = getFilePath(fileName, true);\n indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n `Exporting ${templateId}`\n );\n const templateData = await readEmailTemplate(templateId);\n updateProgressIndicator(indicatorId, `Writing file ${filePath}`);\n const fileData = getFileDataTemplate();\n fileData.emailTemplate[templateId] = templateData;\n saveJsonToFile(fileData, filePath, includeMeta);\n stopProgressIndicator(\n indicatorId,\n `Exported ${templateId['brightCyan']} to ${filePath['brightCyan']}.`\n );\n return true;\n } catch (error) {\n stopProgressIndicator(indicatorId, `${error}`);\n printError(error);\n }\n return false;\n}\n\n/**\n * Export all email templates to file\n * @param {string} file optional filename\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function exportEmailTemplatesToFile(\n file: string,\n includeMeta: boolean = true\n): Promise<boolean> {\n try {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(\n `allEmailTemplates`,\n EMAIL_TEMPLATE_FILE_TYPE\n );\n }\n const filePath = getFilePath(fileName, true);\n const exportData = await exportEmailTemplates();\n saveJsonToFile(exportData, filePath, includeMeta);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Export all email templates to separate files\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function exportEmailTemplatesToFiles(\n includeMeta: boolean = true\n): Promise<boolean> {\n let indicatorId;\n try {\n const exportData = Object.entries(\n (await exportEmailTemplates()).emailTemplate\n );\n indicatorId = createProgressIndicator(\n 'determinate',\n exportData.length,\n 'Writing email templates'\n );\n for (const [templateId, template] of exportData) {\n const fileName = getTypedFilename(templateId, EMAIL_TEMPLATE_FILE_TYPE);\n const fileData = getFileDataTemplate();\n updateProgressIndicator(indicatorId, `Exporting ${templateId}`);\n fileData.emailTemplate[templateId] = template;\n saveJsonToFile(fileData, getFilePath(fileName, true), includeMeta);\n }\n stopProgressIndicator(\n indicatorId,\n `${exportData.length} templates written.`\n );\n return true;\n } catch (error) {\n stopProgressIndicator(indicatorId, `${error}`);\n printError(error);\n }\n return false;\n}\n\n/**\n * Import email template by id from file\n * @param {string} templateId email template id\n * @param {string} file optional filename\n * @param {boolean} raw import raw data file lacking frodo export envelop\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function importEmailTemplateFromFile(\n templateId: string,\n file: string,\n raw: boolean = false\n): Promise<boolean> {\n templateId = templateId.replaceAll(`${EMAIL_TEMPLATE_TYPE}/`, '');\n const filePath = getFilePath(file);\n try {\n const data = fs.readFileSync(filePath, 'utf8');\n const fileData = JSON.parse(data);\n const indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n `Importing ${templateId}`\n );\n if (\n (fileData.emailTemplate && fileData.emailTemplate[templateId]) ||\n (raw && getTemplateIdFromFileName(file) === templateId)\n ) {\n try {\n const emailTemplateData = raw\n ? s2sConvert(fileData)\n : fileData.emailTemplate[templateId];\n await updateEmailTemplate(templateId, emailTemplateData);\n updateProgressIndicator(indicatorId, `Importing ${templateId}`);\n stopProgressIndicator(indicatorId, `Imported ${templateId}`);\n return true;\n } catch (error) {\n stopProgressIndicator(indicatorId, `${error}`);\n printError(error);\n }\n } else {\n stopProgressIndicator(\n indicatorId,\n `Email template ${templateId} not found in ${filePath}!`\n );\n printMessage(\n `Email template ${templateId} not found in ${filePath}!`,\n 'error'\n );\n }\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Import all email templates from file\n * @param {string} file optional filename\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function importEmailTemplatesFromFile(\n file: string\n): Promise<boolean> {\n const filePath = getFilePath(file);\n const indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing email templates from ${filePath}...`\n );\n try {\n const data = fs.readFileSync(filePath, 'utf8');\n const fileData = JSON.parse(data);\n await importEmailTemplates(fileData);\n stopProgressIndicator(\n indicatorId,\n `Successfully imported email templates from ${filePath}.`,\n 'success'\n );\n return true;\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing email templates from ${filePath}.`,\n 'fail'\n );\n printError(error);\n }\n return false;\n}\n\n/**\n * Helper function to get email template id from file name\n * @param {string} file file name\n * @returns {string} email template id/name\n */\nfunction getTemplateIdFromFileName(file: string): string {\n debugMessage(`cli.EmailTemplateOps.getTemplateIdFromFileName: file=${file}`);\n const basename = path.basename(file);\n const keys = basename.split('-');\n if (keys[0] !== EMAIL_TEMPLATE_TYPE || keys.length <= 1)\n throw new FrodoError(\n `Filename does not indicate a raw email template: ${file}`\n );\n const templateId = keys[1].split('.')[0];\n debugMessage(\n `cli.EmailTemplateOps.getTemplateIdFromFileName: templateId=${templateId}`\n );\n return templateId;\n}\n\n/**\n * Convert template for s2s purposes (software-to-saas migration)\n * @param {EmailTemplateSkeleton} templateData template object\n * @returns {EmailTemplateSkeleton} converted template object\n */\nfunction s2sConvert(\n templateData: EmailTemplateSkeleton\n): EmailTemplateSkeleton {\n if (templateData.message && !templateData.html) {\n const convertedData = cloneDeep(templateData);\n convertedData.html = cloneDeep(templateData.message);\n debugMessage(`cli.EmailTemplateOps.s2sConvert: templateData:`);\n debugMessage(templateData);\n debugMessage(`cli.EmailTemplateOps.s2sConvert: convertedData:`);\n debugMessage(convertedData);\n return convertedData;\n }\n return templateData;\n}\n\n/**\n * Import all email templates from separate files\n * @param {boolean} raw import raw data file lacking frodo export envelop\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function importEmailTemplatesFromFiles(\n raw: boolean = false\n): Promise<boolean> {\n const names = fs.readdirSync(getWorkingDirectory());\n const jsonFiles = names\n .filter((name) =>\n raw\n ? name.startsWith(`${EMAIL_TEMPLATE_TYPE}-`) && name.endsWith(`.json`)\n : name.toLowerCase().endsWith(`${EMAIL_TEMPLATE_FILE_TYPE}.json`)\n )\n .map((name) => getFilePath(name));\n const indicatorId = createProgressIndicator(\n 'determinate',\n jsonFiles.length,\n 'Importing email templates...'\n );\n let total = 0;\n let totalErrors = 0;\n for (const file of jsonFiles) {\n const data = fs.readFileSync(file, 'utf8');\n const fileData = JSON.parse(data);\n if (\n (raw && file.startsWith('emailTemplate-')) ||\n validateImport(fileData.meta)\n ) {\n let errors = 0;\n if (raw) {\n total++;\n const templateId = getTemplateIdFromFileName(file);\n try {\n const templateData = s2sConvert(fileData);\n await updateEmailTemplate(templateId, templateData);\n } catch (error) {\n errors += 1;\n printError(error);\n }\n } else {\n total += Object.keys(fileData.emailTemplate).length;\n for (const id in fileData.emailTemplate) {\n if ({}.hasOwnProperty.call(fileData.emailTemplate, id)) {\n const templateId = id.replace(regexEmailTemplateType, '');\n try {\n await updateEmailTemplate(\n templateId,\n fileData.emailTemplate[templateId]\n );\n } catch (error) {\n errors += 1;\n printError(error);\n }\n }\n }\n }\n totalErrors += errors;\n updateProgressIndicator(indicatorId, `Imported ${file}`);\n } else {\n printMessage(`Validation of ${file} failed!`, 'error');\n }\n }\n stopProgressIndicator(\n indicatorId,\n `Imported ${total - totalErrors} of ${total} email template(s) from ${\n jsonFiles.length\n } file(s).`\n );\n if (totalErrors === 0) return true;\n return false;\n}\n\n/**\n * Import first email template from file\n * @param {string} file optional filename\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function importFirstEmailTemplateFromFile(\n file: string,\n raw: boolean = false\n): Promise<boolean> {\n let indicatorId: string;\n try {\n const data = fs.readFileSync(getFilePath(file), 'utf8');\n const fileData = JSON.parse(data);\n indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing first email template`\n );\n if (raw) {\n try {\n const templateId = getTemplateIdFromFileName(file);\n const templateData = s2sConvert(fileData);\n await updateEmailTemplate(templateId, templateData);\n stopProgressIndicator(indicatorId, `Imported ${templateId}`, 'success');\n return true;\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing email template: ${error}`,\n 'fail'\n );\n printError(error);\n }\n } else {\n for (const id of Object.keys(fileData.emailTemplate)) {\n try {\n await updateEmailTemplate(\n id.replace(regexEmailTemplateType, ''),\n fileData.emailTemplate[id]\n );\n stopProgressIndicator(indicatorId, `Imported ${id}`, 'success');\n return true;\n } catch (error) {\n stopProgressIndicator(indicatorId, `Error importing ${id}`, 'fail');\n printError(error);\n }\n break;\n }\n }\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing first email template`,\n 'fail'\n );\n printError(error);\n }\n return false;\n}\n"],"mappings":"AAAA,SAASA,KAAK,EAAEC,UAAU,QAAQ,uBAAuB;AAEzD,OAAOC,EAAE,MAAM,IAAI;AACnB,OAAOC,IAAI,MAAM,MAAM;AAEvB,SACEC,uBAAuB,EACvBC,WAAW,EACXC,YAAY,EACZC,UAAU,EACVC,YAAY,EACZC,qBAAqB,EACrBC,uBAAuB,QAClB,kBAAkB;AACzB,SAASC,SAAS,QAAQ,kBAAkB;AAC5C,OAAOC,QAAQ,MAAM,kBAAkB;AAEvC,MAAM;EACJC,cAAc;EACdC,gBAAgB;EAChBC,cAAc;EACdC,WAAW;EACXC;AACF,CAAC,GAAGjB,KAAK,CAACkB,KAAK;AACf,MAAM;EACJC,mBAAmB;EACnBC,kBAAkB;EAClBC,iBAAiB;EACjBC,oBAAoB;EACpBC,mBAAmB;EACnBC;AACF,CAAC,GAAGxB,KAAK,CAACyB,KAAK,CAACC,QAAQ;AAExB,MAAMC,wBAAwB,GAAG,gBAAgB;AAEjD,MAAMC,sBAAsB,GAAG,IAAIC,MAAM,CAAE,GAAEV,mBAAoB,GAAE,EAAE,GAAG,CAAC;;AAEzE;AACA,SAASW,mBAAmBA,CAAA,EAAG;EAC7B,OAAO;IACLC,IAAI,EAAE,CAAC,CAAC;IACRC,aAAa,EAAE,CAAC;EAClB,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,qBAAqBA,CACnCC,WAAkC,EAC1B;EACR,MAAMC,WAAW,GAAI,IAAGD,WAAW,CAACE,GAAG,CAACC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAE,KAClEH,WAAW,CAACI,WAAW,GAAGJ,WAAW,CAACI,WAAW,GAAG,EACrD,MACCJ,WAAW,CAACK,aAAa,GACrBL,WAAW,CAACM,OAAO,CAACN,WAAW,CAACK,aAAa,CAAC,GAC9CE,MAAM,CAACC,MAAM,CAACR,WAAW,CAACM,OAAO,CAAC,CAAC,CAAC,CACzC,EAAC;EACF,OAAOL,WAAW;AACpB;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASQ,gBAAgBA,CAAA,EAAW;EACzC,IAAIC,QAAQ,GAAG,EAAE;EACjBA,QAAQ,IAAI,+CAA+C;EAC3DA,QAAQ,IAAI,6CAA6C;EACzD,OAAOA,QAAQ;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAACX,WAAkC,EAAU;EACxE,MAAMY,UAAU,GAAGZ,WAAW,CAACE,GAAG,CAACW,OAAO,CAAE,GAAE5B,mBAAoB,GAAE,EAAE,EAAE,CAAC;EACzE,MAAM6B,OAAO,GAAI,GAAEd,WAAW,CAACK,aAAc,GAC3CE,MAAM,CAACQ,IAAI,CAACf,WAAW,CAACM,OAAO,CAAC,CAACU,MAAM,GAAG,CAAC,GACtC,KAAIT,MAAM,CAACQ,IAAI,CAACf,WAAW,CAACM,OAAO,CAAC,CAClCW,MAAM,CAAEC,MAAM,IAAKA,MAAM,KAAKlB,WAAW,CAACK,aAAa,CAAC,CACxDc,IAAI,CAAC,GAAG,CAAE,GAAE,GACf,EACL,EAAC;EACF,MAAMC,GAAG,GAAI,KACXpB,WAAW,CAACqB,IAAI,GAAGrB,WAAW,CAACqB,IAAI,GAAGT,UACvC,MAAKE,OAAQ,MACZd,WAAW,CAACM,OAAO,CAACN,WAAW,CAACK,aAAa,CAC9C,QAAOO,UAAW,MAAK;EACxB,OAAOQ,GAAG;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeE,kBAAkBA,CACtCC,IAAa,GAAG,KAAK,EACH;EAClB,IAAIC,cAAc,GAAG,EAAE;EACvB,IAAI;IACFA,cAAc,GAAG,MAAMtC,kBAAkB,CAAC,CAAC;EAC7C,CAAC,CAAC,OAAOuC,KAAK,EAAE;IACdpD,UAAU,CAACoD,KAAK,CAAC;IACjB,OAAO,KAAK;EACd;EACAD,cAAc,CAACE,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACzB,GAAG,CAAC2B,aAAa,CAACD,CAAC,CAAC1B,GAAG,CAAC,CAAC;EACzD,IAAI,CAACqB,IAAI,EAAE;IACT,KAAK,MAAM,GAAGzB,aAAa,CAAC,IAAI0B,cAAc,CAACM,OAAO,CAAC,CAAC,EAAE;MACxDxD,YAAY,CACT,GAAEwB,aAAa,CAACI,GAAG,CAACW,OAAO,CAAE,GAAE5B,mBAAoB,GAAE,EAAE,EAAE,CAAE,EAAC,EAC7D,MACF,CAAC;IACH;EACF,CAAC,MAAM;IACL,MAAM8C,KAAK,GAAG5D,WAAW,CAAC,CACxB,IAAI,CAAC,YAAY,CAAC,EAClB,MAAM,CAAC,YAAY,CAAC,EACpB,QAAQ,CAAC,YAAY,CAAC,EACtB,WAAW,CAAC,YAAY,CAAC,EACzB,MAAM,CAAC,YAAY,CAAC,EACpB,SAAS,CAAC,YAAY,CAAC,CACxB,CAAC;IACF,KAAK,MAAM2B,aAAa,IAAI0B,cAAc,EAAE;MAC1CO,KAAK,CAACC,IAAI,CAAC;MACT;MACC,GAAElC,aAAa,CAACI,GAAG,CAACW,OAAO,CAAE,GAAE5B,mBAAoB,GAAE,EAAE,EAAE,CAAE,EAAC;MAC7D;MACC,GAAEa,aAAa,CAACM,WAAW,GAAGN,aAAa,CAACM,WAAW,GAAG,EAAG,EAAC;MAC/D;MACAN,aAAa,CAACmC,OAAO,KAAK,KAAK,GAC3B,UAAU,CAAC,WAAW,CAAC,GACvB,SAAS,CAAC,aAAa,CAAC;MAC5B;MACC,GAAEnC,aAAa,CAACO,aAAc,GAC7BE,MAAM,CAACQ,IAAI,CAACjB,aAAa,CAACQ,OAAO,CAAC,CAACU,MAAM,GAAG,CAAC,GACxC,KAAIT,MAAM,CAACQ,IAAI,CAACjB,aAAa,CAACQ,OAAO,CAAC,CACpCW,MAAM,CAAEC,MAAM,IAAKA,MAAM,KAAKpB,aAAa,CAACO,aAAa,CAAC,CAC1Dc,IAAI,CAAC,GAAG,CAAE,GAAE,GACf,EACL,EAAC;MACF;MACC,GAAErB,aAAa,CAACoC,IAAI,GAAGpC,aAAa,CAACoC,IAAI,GAAG,EAAG,EAAC;MACjD;MACAxD,QAAQ,CAACoB,aAAa,CAACQ,OAAO,CAACR,aAAa,CAACO,aAAa,CAAC,EAAE,EAAE,CAAC,CACjE,CAAC;IACJ;IACA/B,YAAY,CAACyD,KAAK,CAACI,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;EACxC;EACA,OAAO,IAAI;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,yBAAyBA,CAC7CxB,UAAkB,EAClByB,IAAY,EACZC,WAAoB,GAAG,IAAI,EACT;EAClB,IAAIC,WAAmB;EACvB,IAAI;IACF,IAAIC,QAAQ,GAAGH,IAAI;IACnB,IAAI,CAACG,QAAQ,EAAE;MACbA,QAAQ,GAAG5D,gBAAgB,CAACgC,UAAU,EAAEnB,wBAAwB,CAAC;IACnE;IACA,MAAMgD,QAAQ,GAAG3D,WAAW,CAAC0D,QAAQ,EAAE,IAAI,CAAC;IAC5CD,WAAW,GAAGrE,uBAAuB,CACnC,aAAa,EACb,CAAC,EACA,aAAY0C,UAAW,EAC1B,CAAC;IACD,MAAM8B,YAAY,GAAG,MAAMvD,iBAAiB,CAACyB,UAAU,CAAC;IACxDpC,uBAAuB,CAAC+D,WAAW,EAAG,gBAAeE,QAAS,EAAC,CAAC;IAChE,MAAME,QAAQ,GAAG/C,mBAAmB,CAAC,CAAC;IACtC+C,QAAQ,CAAC7C,aAAa,CAACc,UAAU,CAAC,GAAG8B,YAAY;IACjD7D,cAAc,CAAC8D,QAAQ,EAAEF,QAAQ,EAAEH,WAAW,CAAC;IAC/C/D,qBAAqB,CACnBgE,WAAW,EACV,YAAW3B,UAAU,CAAC,YAAY,CAAE,OAAM6B,QAAQ,CAAC,YAAY,CAAE,GACpE,CAAC;IACD,OAAO,IAAI;EACb,CAAC,CAAC,OAAOhB,KAAK,EAAE;IACdlD,qBAAqB,CAACgE,WAAW,EAAG,GAAEd,KAAM,EAAC,CAAC;IAC9CpD,UAAU,CAACoD,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAemB,0BAA0BA,CAC9CP,IAAY,EACZC,WAAoB,GAAG,IAAI,EACT;EAClB,IAAI;IACF,IAAIE,QAAQ,GAAGH,IAAI;IACnB,IAAI,CAACG,QAAQ,EAAE;MACbA,QAAQ,GAAG5D,gBAAgB,CACxB,mBAAkB,EACnBa,wBACF,CAAC;IACH;IACA,MAAMgD,QAAQ,GAAG3D,WAAW,CAAC0D,QAAQ,EAAE,IAAI,CAAC;IAC5C,MAAMK,UAAU,GAAG,MAAMzD,oBAAoB,CAAC,CAAC;IAC/CP,cAAc,CAACgE,UAAU,EAAEJ,QAAQ,EAAEH,WAAW,CAAC;IACjD,OAAO,IAAI;EACb,CAAC,CAAC,OAAOb,KAAK,EAAE;IACdpD,UAAU,CAACoD,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeqB,2BAA2BA,CAC/CR,WAAoB,GAAG,IAAI,EACT;EAClB,IAAIC,WAAW;EACf,IAAI;IACF,MAAMM,UAAU,GAAGtC,MAAM,CAACuB,OAAO,CAC/B,CAAC,MAAM1C,oBAAoB,CAAC,CAAC,EAAEU,aACjC,CAAC;IACDyC,WAAW,GAAGrE,uBAAuB,CACnC,aAAa,EACb2E,UAAU,CAAC7B,MAAM,EACjB,yBACF,CAAC;IACD,KAAK,MAAM,CAACJ,UAAU,EAAEpB,QAAQ,CAAC,IAAIqD,UAAU,EAAE;MAC/C,MAAML,QAAQ,GAAG5D,gBAAgB,CAACgC,UAAU,EAAEnB,wBAAwB,CAAC;MACvE,MAAMkD,QAAQ,GAAG/C,mBAAmB,CAAC,CAAC;MACtCpB,uBAAuB,CAAC+D,WAAW,EAAG,aAAY3B,UAAW,EAAC,CAAC;MAC/D+B,QAAQ,CAAC7C,aAAa,CAACc,UAAU,CAAC,GAAGpB,QAAQ;MAC7CX,cAAc,CAAC8D,QAAQ,EAAE7D,WAAW,CAAC0D,QAAQ,EAAE,IAAI,CAAC,EAAEF,WAAW,CAAC;IACpE;IACA/D,qBAAqB,CACnBgE,WAAW,EACV,GAAEM,UAAU,CAAC7B,MAAO,qBACvB,CAAC;IACD,OAAO,IAAI;EACb,CAAC,CAAC,OAAOS,KAAK,EAAE;IACdlD,qBAAqB,CAACgE,WAAW,EAAG,GAAEd,KAAM,EAAC,CAAC;IAC9CpD,UAAU,CAACoD,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAesB,2BAA2BA,CAC/CnC,UAAkB,EAClByB,IAAY,EACZW,GAAY,GAAG,KAAK,EACF;EAClBpC,UAAU,GAAGA,UAAU,CAACqC,UAAU,CAAE,GAAEhE,mBAAoB,GAAE,EAAE,EAAE,CAAC;EACjE,MAAMwD,QAAQ,GAAG3D,WAAW,CAACuD,IAAI,CAAC;EAClC,IAAI;IACF,MAAMa,IAAI,GAAGlF,EAAE,CAACmF,YAAY,CAACV,QAAQ,EAAE,MAAM,CAAC;IAC9C,MAAME,QAAQ,GAAGS,IAAI,CAACC,KAAK,CAACH,IAAI,CAAC;IACjC,MAAMX,WAAW,GAAGrE,uBAAuB,CACzC,aAAa,EACb,CAAC,EACA,aAAY0C,UAAW,EAC1B,CAAC;IACD,IACG+B,QAAQ,CAAC7C,aAAa,IAAI6C,QAAQ,CAAC7C,aAAa,CAACc,UAAU,CAAC,IAC5DoC,GAAG,IAAIM,yBAAyB,CAACjB,IAAI,CAAC,KAAKzB,UAAW,EACvD;MACA,IAAI;QACF,MAAM2C,iBAAiB,GAAGP,GAAG,GACzBQ,UAAU,CAACb,QAAQ,CAAC,GACpBA,QAAQ,CAAC7C,aAAa,CAACc,UAAU,CAAC;QACtC,MAAMvB,mBAAmB,CAACuB,UAAU,EAAE2C,iBAAiB,CAAC;QACxD/E,uBAAuB,CAAC+D,WAAW,EAAG,aAAY3B,UAAW,EAAC,CAAC;QAC/DrC,qBAAqB,CAACgE,WAAW,EAAG,YAAW3B,UAAW,EAAC,CAAC;QAC5D,OAAO,IAAI;MACb,CAAC,CAAC,OAAOa,KAAK,EAAE;QACdlD,qBAAqB,CAACgE,WAAW,EAAG,GAAEd,KAAM,EAAC,CAAC;QAC9CpD,UAAU,CAACoD,KAAK,CAAC;MACnB;IACF,CAAC,MAAM;MACLlD,qBAAqB,CACnBgE,WAAW,EACV,kBAAiB3B,UAAW,iBAAgB6B,QAAS,GACxD,CAAC;MACDnE,YAAY,CACT,kBAAiBsC,UAAW,iBAAgB6B,QAAS,GAAE,EACxD,OACF,CAAC;IACH;EACF,CAAC,CAAC,OAAOhB,KAAK,EAAE;IACdpD,UAAU,CAACoD,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAegC,4BAA4BA,CAChDpB,IAAY,EACM;EAClB,MAAMI,QAAQ,GAAG3D,WAAW,CAACuD,IAAI,CAAC;EAClC,MAAME,WAAW,GAAGrE,uBAAuB,CACzC,eAAe,EACf,CAAC,EACA,kCAAiCuE,QAAS,KAC7C,CAAC;EACD,IAAI;IACF,MAAMS,IAAI,GAAGlF,EAAE,CAACmF,YAAY,CAACV,QAAQ,EAAE,MAAM,CAAC;IAC9C,MAAME,QAAQ,GAAGS,IAAI,CAACC,KAAK,CAACH,IAAI,CAAC;IACjC,MAAM5D,oBAAoB,CAACqD,QAAQ,CAAC;IACpCpE,qBAAqB,CACnBgE,WAAW,EACV,8CAA6CE,QAAS,GAAE,EACzD,SACF,CAAC;IACD,OAAO,IAAI;EACb,CAAC,CAAC,OAAOhB,KAAK,EAAE;IACdlD,qBAAqB,CACnBgE,WAAW,EACV,wCAAuCE,QAAS,GAAE,EACnD,MACF,CAAC;IACDpE,UAAU,CAACoD,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS6B,yBAAyBA,CAACjB,IAAY,EAAU;EACvDjE,YAAY,CAAE,wDAAuDiE,IAAK,EAAC,CAAC;EAC5E,MAAMqB,QAAQ,GAAGzF,IAAI,CAACyF,QAAQ,CAACrB,IAAI,CAAC;EACpC,MAAMtB,IAAI,GAAG2C,QAAQ,CAACvD,KAAK,CAAC,GAAG,CAAC;EAChC,IAAIY,IAAI,CAAC,CAAC,CAAC,KAAK9B,mBAAmB,IAAI8B,IAAI,CAACC,MAAM,IAAI,CAAC,EACrD,MAAM,IAAIjD,UAAU,CACjB,oDAAmDsE,IAAK,EAC3D,CAAC;EACH,MAAMzB,UAAU,GAAGG,IAAI,CAAC,CAAC,CAAC,CAACZ,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;EACxC/B,YAAY,CACT,8DAA6DwC,UAAW,EAC3E,CAAC;EACD,OAAOA,UAAU;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS4C,UAAUA,CACjBd,YAAmC,EACZ;EACvB,IAAIA,YAAY,CAACiB,OAAO,IAAI,CAACjB,YAAY,CAACkB,IAAI,EAAE;IAC9C,MAAMC,aAAa,GAAGpF,SAAS,CAACiE,YAAY,CAAC;IAC7CmB,aAAa,CAACD,IAAI,GAAGnF,SAAS,CAACiE,YAAY,CAACiB,OAAO,CAAC;IACpDvF,YAAY,CAAE,gDAA+C,CAAC;IAC9DA,YAAY,CAACsE,YAAY,CAAC;IAC1BtE,YAAY,CAAE,iDAAgD,CAAC;IAC/DA,YAAY,CAACyF,aAAa,CAAC;IAC3B,OAAOA,aAAa;EACtB;EACA,OAAOnB,YAAY;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeoB,6BAA6BA,CACjDd,GAAY,GAAG,KAAK,EACF;EAClB,MAAMe,KAAK,GAAG/F,EAAE,CAACgG,WAAW,CAACjF,mBAAmB,CAAC,CAAC,CAAC;EACnD,MAAMkF,SAAS,GAAGF,KAAK,CACpB9C,MAAM,CAAEI,IAAI,IACX2B,GAAG,GACC3B,IAAI,CAAC6C,UAAU,CAAE,GAAEjF,mBAAoB,GAAE,CAAC,IAAIoC,IAAI,CAAC8C,QAAQ,CAAE,OAAM,CAAC,GACpE9C,IAAI,CAAC+C,WAAW,CAAC,CAAC,CAACD,QAAQ,CAAE,GAAE1E,wBAAyB,OAAM,CACpE,CAAC,CACA4E,GAAG,CAAEhD,IAAI,IAAKvC,WAAW,CAACuC,IAAI,CAAC,CAAC;EACnC,MAAMkB,WAAW,GAAGrE,uBAAuB,CACzC,aAAa,EACb+F,SAAS,CAACjD,MAAM,EAChB,8BACF,CAAC;EACD,IAAIsD,KAAK,GAAG,CAAC;EACb,IAAIC,WAAW,GAAG,CAAC;EACnB,KAAK,MAAMlC,IAAI,IAAI4B,SAAS,EAAE;IAC5B,MAAMf,IAAI,GAAGlF,EAAE,CAACmF,YAAY,CAACd,IAAI,EAAE,MAAM,CAAC;IAC1C,MAAMM,QAAQ,GAAGS,IAAI,CAACC,KAAK,CAACH,IAAI,CAAC;IACjC,IACGF,GAAG,IAAIX,IAAI,CAAC6B,UAAU,CAAC,gBAAgB,CAAC,IACzCvF,cAAc,CAACgE,QAAQ,CAAC9C,IAAI,CAAC,EAC7B;MACA,IAAI2E,MAAM,GAAG,CAAC;MACd,IAAIxB,GAAG,EAAE;QACPsB,KAAK,EAAE;QACP,MAAM1D,UAAU,GAAG0C,yBAAyB,CAACjB,IAAI,CAAC;QAClD,IAAI;UACF,MAAMK,YAAY,GAAGc,UAAU,CAACb,QAAQ,CAAC;UACzC,MAAMtD,mBAAmB,CAACuB,UAAU,EAAE8B,YAAY,CAAC;QACrD,CAAC,CAAC,OAAOjB,KAAK,EAAE;UACd+C,MAAM,IAAI,CAAC;UACXnG,UAAU,CAACoD,KAAK,CAAC;QACnB;MACF,CAAC,MAAM;QACL6C,KAAK,IAAI/D,MAAM,CAACQ,IAAI,CAAC4B,QAAQ,CAAC7C,aAAa,CAAC,CAACkB,MAAM;QACnD,KAAK,MAAMyD,EAAE,IAAI9B,QAAQ,CAAC7C,aAAa,EAAE;UACvC,IAAI,CAAC,CAAC,CAAC4E,cAAc,CAACC,IAAI,CAAChC,QAAQ,CAAC7C,aAAa,EAAE2E,EAAE,CAAC,EAAE;YACtD,MAAM7D,UAAU,GAAG6D,EAAE,CAAC5D,OAAO,CAACnB,sBAAsB,EAAE,EAAE,CAAC;YACzD,IAAI;cACF,MAAML,mBAAmB,CACvBuB,UAAU,EACV+B,QAAQ,CAAC7C,aAAa,CAACc,UAAU,CACnC,CAAC;YACH,CAAC,CAAC,OAAOa,KAAK,EAAE;cACd+C,MAAM,IAAI,CAAC;cACXnG,UAAU,CAACoD,KAAK,CAAC;YACnB;UACF;QACF;MACF;MACA8C,WAAW,IAAIC,MAAM;MACrBhG,uBAAuB,CAAC+D,WAAW,EAAG,YAAWF,IAAK,EAAC,CAAC;IAC1D,CAAC,MAAM;MACL/D,YAAY,CAAE,iBAAgB+D,IAAK,UAAS,EAAE,OAAO,CAAC;IACxD;EACF;EACA9D,qBAAqB,CACnBgE,WAAW,EACV,YAAW+B,KAAK,GAAGC,WAAY,OAAMD,KAAM,2BAC1CL,SAAS,CAACjD,MACX,WACH,CAAC;EACD,IAAIuD,WAAW,KAAK,CAAC,EAAE,OAAO,IAAI;EAClC,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeK,gCAAgCA,CACpDvC,IAAY,EACZW,GAAY,GAAG,KAAK,EACF;EAClB,IAAIT,WAAmB;EACvB,IAAI;IACF,MAAMW,IAAI,GAAGlF,EAAE,CAACmF,YAAY,CAACrE,WAAW,CAACuD,IAAI,CAAC,EAAE,MAAM,CAAC;IACvD,MAAMM,QAAQ,GAAGS,IAAI,CAACC,KAAK,CAACH,IAAI,CAAC;IACjCX,WAAW,GAAGrE,uBAAuB,CACnC,eAAe,EACf,CAAC,EACA,gCACH,CAAC;IACD,IAAI8E,GAAG,EAAE;MACP,IAAI;QACF,MAAMpC,UAAU,GAAG0C,yBAAyB,CAACjB,IAAI,CAAC;QAClD,MAAMK,YAAY,GAAGc,UAAU,CAACb,QAAQ,CAAC;QACzC,MAAMtD,mBAAmB,CAACuB,UAAU,EAAE8B,YAAY,CAAC;QACnDnE,qBAAqB,CAACgE,WAAW,EAAG,YAAW3B,UAAW,EAAC,EAAE,SAAS,CAAC;QACvE,OAAO,IAAI;MACb,CAAC,CAAC,OAAOa,KAAK,EAAE;QACdlD,qBAAqB,CACnBgE,WAAW,EACV,mCAAkCd,KAAM,EAAC,EAC1C,MACF,CAAC;QACDpD,UAAU,CAACoD,KAAK,CAAC;MACnB;IACF,CAAC,MAAM;MACL,KAAK,MAAMgD,EAAE,IAAIlE,MAAM,CAACQ,IAAI,CAAC4B,QAAQ,CAAC7C,aAAa,CAAC,EAAE;QACpD,IAAI;UACF,MAAMT,mBAAmB,CACvBoF,EAAE,CAAC5D,OAAO,CAACnB,sBAAsB,EAAE,EAAE,CAAC,EACtCiD,QAAQ,CAAC7C,aAAa,CAAC2E,EAAE,CAC3B,CAAC;UACDlG,qBAAqB,CAACgE,WAAW,EAAG,YAAWkC,EAAG,EAAC,EAAE,SAAS,CAAC;UAC/D,OAAO,IAAI;QACb,CAAC,CAAC,OAAOhD,KAAK,EAAE;UACdlD,qBAAqB,CAACgE,WAAW,EAAG,mBAAkBkC,EAAG,EAAC,EAAE,MAAM,CAAC;UACnEpG,UAAU,CAACoD,KAAK,CAAC;QACnB;QACA;MACF;IACF;EACF,CAAC,CAAC,OAAOA,KAAK,EAAE;IACdlD,qBAAqB,CACnBgE,WAAW,EACV,sCAAqC,EACtC,MACF,CAAC;IACDlE,UAAU,CAACoD,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd"}
|