azp-cli 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/.vscode/extensions.json +3 -0
  2. package/.vscode/launch.json +25 -0
  3. package/.vscode/settings.json +25 -0
  4. package/.vscode/tasks.json +28 -0
  5. package/README.md +203 -0
  6. package/dist/auth.d.ts +11 -0
  7. package/dist/auth.d.ts.map +1 -0
  8. package/dist/auth.js +52 -0
  9. package/dist/auth.js.map +1 -0
  10. package/dist/azure-pim.d.ts +44 -0
  11. package/dist/azure-pim.d.ts.map +1 -0
  12. package/dist/azure-pim.js +183 -0
  13. package/dist/azure-pim.js.map +1 -0
  14. package/dist/cli.d.ts +5 -0
  15. package/dist/cli.d.ts.map +1 -0
  16. package/dist/cli.js +339 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +54 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/ui/App.d.ts +9 -0
  23. package/dist/ui/App.d.ts.map +1 -0
  24. package/dist/ui/App.js +85 -0
  25. package/dist/ui/App.js.map +1 -0
  26. package/dist/ui/components.d.ts +18 -0
  27. package/dist/ui/components.d.ts.map +1 -0
  28. package/dist/ui/components.js +13 -0
  29. package/dist/ui/components.js.map +1 -0
  30. package/dist/ui/router.d.ts +22 -0
  31. package/dist/ui/router.d.ts.map +1 -0
  32. package/dist/ui/router.js +19 -0
  33. package/dist/ui/router.js.map +1 -0
  34. package/dist/ui/screens/ActivateFlow.d.ts +25 -0
  35. package/dist/ui/screens/ActivateFlow.d.ts.map +1 -0
  36. package/dist/ui/screens/ActivateFlow.js +195 -0
  37. package/dist/ui/screens/ActivateFlow.js.map +1 -0
  38. package/dist/ui/screens/DeactivateFlow.d.ts +22 -0
  39. package/dist/ui/screens/DeactivateFlow.d.ts.map +1 -0
  40. package/dist/ui/screens/DeactivateFlow.js +115 -0
  41. package/dist/ui/screens/DeactivateFlow.js.map +1 -0
  42. package/dist/ui/useExitConfirmation.d.ts +7 -0
  43. package/dist/ui/useExitConfirmation.d.ts.map +1 -0
  44. package/dist/ui/useExitConfirmation.js +17 -0
  45. package/dist/ui/useExitConfirmation.js.map +1 -0
  46. package/dist/ui/widgets/CheckboxList.d.ts +14 -0
  47. package/dist/ui/widgets/CheckboxList.d.ts.map +1 -0
  48. package/dist/ui/widgets/CheckboxList.js +59 -0
  49. package/dist/ui/widgets/CheckboxList.js.map +1 -0
  50. package/dist/ui/widgets/ConfirmPrompt.d.ts +8 -0
  51. package/dist/ui/widgets/ConfirmPrompt.d.ts.map +1 -0
  52. package/dist/ui/widgets/ConfirmPrompt.js +19 -0
  53. package/dist/ui/widgets/ConfirmPrompt.js.map +1 -0
  54. package/dist/ui/widgets/NumberPrompt.d.ts +10 -0
  55. package/dist/ui/widgets/NumberPrompt.d.ts.map +1 -0
  56. package/dist/ui/widgets/NumberPrompt.js +38 -0
  57. package/dist/ui/widgets/NumberPrompt.js.map +1 -0
  58. package/dist/ui/widgets/SelectList.d.ts +14 -0
  59. package/dist/ui/widgets/SelectList.d.ts.map +1 -0
  60. package/dist/ui/widgets/SelectList.js +34 -0
  61. package/dist/ui/widgets/SelectList.js.map +1 -0
  62. package/dist/ui/widgets/TextPrompt.d.ts +10 -0
  63. package/dist/ui/widgets/TextPrompt.d.ts.map +1 -0
  64. package/dist/ui/widgets/TextPrompt.js +30 -0
  65. package/dist/ui/widgets/TextPrompt.js.map +1 -0
  66. package/dist/ui.d.ts +26 -0
  67. package/dist/ui.d.ts.map +1 -0
  68. package/dist/ui.js +183 -0
  69. package/dist/ui.js.map +1 -0
  70. package/package.json +47 -0
  71. package/pnpm-workspace.yaml +2 -0
  72. package/src/auth.ts +66 -0
  73. package/src/azure-pim.ts +262 -0
  74. package/src/cli.ts +401 -0
  75. package/src/index.ts +65 -0
  76. package/src/ui.ts +253 -0
  77. package/tsconfig.json +45 -0
@@ -0,0 +1,14 @@
1
+ export type SelectListItem<T> = {
2
+ key: string;
3
+ label: string;
4
+ value: T;
5
+ meta?: string;
6
+ };
7
+ export type SelectListProps<T> = {
8
+ items: SelectListItem<T>[];
9
+ isLoading?: boolean;
10
+ emptyLabel?: string;
11
+ onSelect: (value: T) => void;
12
+ };
13
+ export declare const SelectList: <T>({ items, isLoading, emptyLabel, onSelect }: SelectListProps<T>) => import("react/jsx-runtime").JSX.Element;
14
+ //# sourceMappingURL=SelectList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectList.d.ts","sourceRoot":"","sources":["../../../src/ui/widgets/SelectList.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAC/B,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,CAAC,EAAG,4CAA4C,eAAe,CAAC,CAAC,CAAC,4CA4D5F,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text, useInput } from "ink";
3
+ import { useMemo, useState } from "react";
4
+ export const SelectList = ({ items, isLoading, emptyLabel, onSelect }) => {
5
+ const [index, setIndex] = useState(0);
6
+ const safeItems = useMemo(() => items ?? [], [items]);
7
+ const maxIndex = Math.max(0, safeItems.length - 1);
8
+ useInput((_input, key) => {
9
+ if (isLoading)
10
+ return;
11
+ if (safeItems.length === 0)
12
+ return;
13
+ if (key.upArrow)
14
+ setIndex((i) => (i <= 0 ? maxIndex : i - 1));
15
+ if (key.downArrow)
16
+ setIndex((i) => (i >= maxIndex ? 0 : i + 1));
17
+ if (key.return) {
18
+ const item = safeItems[index];
19
+ if (item)
20
+ onSelect(item.value);
21
+ }
22
+ }, { isActive: !isLoading });
23
+ if (isLoading) {
24
+ return (_jsx(Box, { children: _jsx(Text, { dimColor: true, children: "Loading\u2026" }) }));
25
+ }
26
+ if (safeItems.length === 0) {
27
+ return (_jsx(Box, { children: _jsx(Text, { dimColor: true, children: emptyLabel ?? "No items." }) }));
28
+ }
29
+ return (_jsxs(Box, { flexDirection: "column", children: [safeItems.map((item, i) => {
30
+ const isSelected = i === index;
31
+ return (_jsxs(Box, { children: [_jsx(Text, { color: isSelected ? "green" : undefined, children: isSelected ? "❯ " : " " }), _jsx(Text, { children: item.label }), item.meta ? (_jsxs(_Fragment, { children: [_jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: item.meta })] })) : null] }, item.key));
32
+ }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "\u2191\u2193 navigate \u00B7 Enter select" }) })] }));
33
+ };
34
+ //# sourceMappingURL=SelectList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectList.js","sourceRoot":"","sources":["../../../src/ui/widgets/SelectList.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAgB1C,MAAM,CAAC,MAAM,UAAU,GAAG,CAAK,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAsB,EAAE,EAAE;IAC/F,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEtC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEnD,QAAQ,CACN,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACd,IAAI,SAAS;YAAE,OAAO;QACtB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEnC,IAAI,GAAG,CAAC,OAAO;YAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9D,IAAI,GAAG,CAAC,SAAS;YAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAEhE,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,IAAI;gBAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,EACD,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,CACzB,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CACL,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,QAAQ,oCAAgB,GAC1B,CACP,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CACL,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,QAAQ,kBAAE,UAAU,IAAI,WAAW,GAAQ,GAC7C,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACxB,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;gBACzB,MAAM,UAAU,GAAG,CAAC,KAAK,KAAK,CAAC;gBAC/B,OAAO,CACL,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,YAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAQ,EAChF,KAAC,IAAI,cAAE,IAAI,CAAC,KAAK,GAAQ,EACxB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CACX,8BACE,KAAC,IAAI,oBAAS,EACd,KAAC,IAAI,IAAC,QAAQ,kBAAE,IAAI,CAAC,IAAI,GAAQ,IAChC,CACJ,CAAC,CAAC,CAAC,IAAI,KARA,IAAI,CAAC,GAAG,CASZ,CACP,CAAC;YACJ,CAAC,CAAC,EACF,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,QAAQ,gEAAkC,GAC5C,IACF,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ export type TextPromptProps = {
3
+ label: string;
4
+ initialValue?: string;
5
+ placeholder?: string;
6
+ validate?: (value: string) => string | true;
7
+ onSubmit: (value: string) => void;
8
+ };
9
+ export declare const TextPrompt: React.FC<TextPromptProps>;
10
+ //# sourceMappingURL=TextPrompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextPrompt.d.ts","sourceRoot":"","sources":["../../../src/ui/widgets/TextPrompt.tsx"],"names":[],"mappings":"AACA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAEjD,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC5C,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA+ChD,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text, useInput } from "ink";
3
+ import { useMemo, useState } from "react";
4
+ export const TextPrompt = ({ label, initialValue, placeholder, validate, onSubmit }) => {
5
+ const [value, setValue] = useState(initialValue ?? "");
6
+ const [error, setError] = useState(null);
7
+ const display = useMemo(() => (value.length > 0 ? value : placeholder ?? ""), [value, placeholder]);
8
+ useInput((input, key) => {
9
+ if (key.return) {
10
+ const result = validate ? validate(value) : true;
11
+ if (result === true) {
12
+ setError(null);
13
+ onSubmit(value);
14
+ }
15
+ else {
16
+ setError(result);
17
+ }
18
+ return;
19
+ }
20
+ if (key.backspace || key.delete) {
21
+ setValue((v) => v.slice(0, -1));
22
+ return;
23
+ }
24
+ if (!key.ctrl && !key.meta && input) {
25
+ setValue((v) => v + input);
26
+ }
27
+ });
28
+ return (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsx(Box, { children: _jsx(Text, { children: label }) }), _jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: "\u203A " }), _jsx(Text, { dimColor: value.length === 0, children: display })] }), error ? (_jsx(Box, { children: _jsx(Text, { color: "red", children: error }) })) : null, _jsx(Box, { children: _jsx(Text, { dimColor: true, children: "Type and press Enter" }) })] }));
29
+ };
30
+ //# sourceMappingURL=TextPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextPrompt.js","sourceRoot":"","sources":["../../../src/ui/widgets/TextPrompt.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAUjD,MAAM,CAAC,MAAM,UAAU,GAA8B,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;IAChH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IAEpG,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACjD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACf,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnB,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAChC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC;YACpC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,GAAG,EAAE,CAAC,aAChC,KAAC,GAAG,cACF,KAAC,IAAI,cAAE,KAAK,GAAQ,GAChB,EACN,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,wBAAU,EAC5B,KAAC,IAAI,IAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,YAAG,OAAO,GAAQ,IAChD,EACL,KAAK,CAAC,CAAC,CAAC,CACP,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,YAAE,KAAK,GAAQ,GAC5B,CACP,CAAC,CAAC,CAAC,IAAI,EACR,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,QAAQ,2CAA4B,GACtC,IACF,CACP,CAAC;AACJ,CAAC,CAAC"}
package/dist/ui.d.ts ADDED
@@ -0,0 +1,26 @@
1
+ import { type Ora } from "ora";
2
+ export declare const startSpinner: (text: string) => Ora;
3
+ export declare const updateSpinner: (text: string) => void;
4
+ export declare const succeedSpinner: (text?: string) => void;
5
+ export declare const failSpinner: (text?: string) => void;
6
+ export declare const warnSpinner: (text?: string) => void;
7
+ export declare const infoSpinner: (text?: string) => void;
8
+ export declare const stopSpinner: () => void;
9
+ export declare const logInfo: (message: string) => void;
10
+ export declare const logSuccess: (message: string) => void;
11
+ export declare const logError: (message: string) => void;
12
+ export declare const logWarning: (message: string) => void;
13
+ export declare const logDim: (message: string) => void;
14
+ export declare const logBlank: () => void;
15
+ export declare const showHeader: () => void;
16
+ export declare const showDivider: () => void;
17
+ export declare const formatRole: (roleName: string, scopeDisplayName: string) => string;
18
+ export declare const formatActiveRole: (roleName: string, scopeDisplayName: string, subscriptionName: string, startDateTime: string) => string;
19
+ export declare const formatSubscription: (displayName: string, subscriptionId: string) => string;
20
+ export declare const formatStatus: (status: string) => string;
21
+ export declare const showSummary: (title: string, items: {
22
+ label: string;
23
+ value: string;
24
+ }[]) => void;
25
+ export declare const withSpinner: <T>(text: string, operation: () => Promise<T>, successText?: string, failText?: string) => Promise<T>;
26
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAYpC,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,GAS3C,CAAC;AAKF,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,IAI5C,CAAC;AAKF,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,KAAG,IAS9C,CAAC;AAKF,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,IAS3C,CAAC;AAKF,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,IAS3C,CAAC;AAKF,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,IAS3C,CAAC;AAKF,eAAO,MAAM,WAAW,QAAO,IAK9B,CAAC;AASF,eAAO,MAAM,OAAO,GAAI,SAAS,MAAM,KAAG,IAEzC,CAAC;AAKF,eAAO,MAAM,UAAU,GAAI,SAAS,MAAM,KAAG,IAE5C,CAAC;AAKF,eAAO,MAAM,QAAQ,GAAI,SAAS,MAAM,KAAG,IAE1C,CAAC;AAKF,eAAO,MAAM,UAAU,GAAI,SAAS,MAAM,KAAG,IAE5C,CAAC;AAKF,eAAO,MAAM,MAAM,GAAI,SAAS,MAAM,KAAG,IAExC,CAAC;AAKF,eAAO,MAAM,QAAQ,QAAO,IAE3B,CAAC;AASF,eAAO,MAAM,UAAU,QAAO,IAM7B,CAAC;AAKF,eAAO,MAAM,WAAW,QAAO,IAE9B,CAAC;AAKF,eAAO,MAAM,UAAU,GAAI,UAAU,MAAM,EAAE,kBAAkB,MAAM,KAAG,MAEvE,CAAC;AAKF,eAAO,MAAM,gBAAgB,GAAI,UAAU,MAAM,EAAE,kBAAkB,MAAM,EAAE,kBAAkB,MAAM,EAAE,eAAe,MAAM,KAAG,MAK9H,CAAC;AAKF,eAAO,MAAM,kBAAkB,GAAI,aAAa,MAAM,EAAE,gBAAgB,MAAM,KAAG,MAEhF,CAAC;AAKF,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,KAAG,MAe7C,CAAC;AAKF,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,EAAE,OAAO;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,KAAG,IAUtF,CAAC;AAUF,eAAO,MAAM,WAAW,GAAU,CAAC,EAAE,MAAM,MAAM,EAAE,WAAW,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,cAAc,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC,CAAC,CAkBlI,CAAC"}
package/dist/ui.js ADDED
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.withSpinner = exports.showSummary = exports.formatStatus = exports.formatSubscription = exports.formatActiveRole = exports.formatRole = exports.showDivider = exports.showHeader = exports.logBlank = exports.logDim = exports.logWarning = exports.logError = exports.logSuccess = exports.logInfo = exports.stopSpinner = exports.infoSpinner = exports.warnSpinner = exports.failSpinner = exports.succeedSpinner = exports.updateSpinner = exports.startSpinner = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ let currentSpinner = null;
10
+ const startSpinner = (text) => {
11
+ if (currentSpinner) {
12
+ currentSpinner.stop();
13
+ }
14
+ currentSpinner = (0, ora_1.default)({
15
+ text: chalk_1.default.cyan(text),
16
+ color: "cyan",
17
+ }).start();
18
+ return currentSpinner;
19
+ };
20
+ exports.startSpinner = startSpinner;
21
+ const updateSpinner = (text) => {
22
+ if (currentSpinner) {
23
+ currentSpinner.text = chalk_1.default.cyan(text);
24
+ }
25
+ };
26
+ exports.updateSpinner = updateSpinner;
27
+ const succeedSpinner = (text) => {
28
+ if (currentSpinner) {
29
+ if (text) {
30
+ currentSpinner.succeed(chalk_1.default.green(text));
31
+ }
32
+ else {
33
+ currentSpinner.succeed();
34
+ }
35
+ currentSpinner = null;
36
+ }
37
+ };
38
+ exports.succeedSpinner = succeedSpinner;
39
+ const failSpinner = (text) => {
40
+ if (currentSpinner) {
41
+ if (text) {
42
+ currentSpinner.fail(chalk_1.default.red(text));
43
+ }
44
+ else {
45
+ currentSpinner.fail();
46
+ }
47
+ currentSpinner = null;
48
+ }
49
+ };
50
+ exports.failSpinner = failSpinner;
51
+ const warnSpinner = (text) => {
52
+ if (currentSpinner) {
53
+ if (text) {
54
+ currentSpinner.warn(chalk_1.default.yellow(text));
55
+ }
56
+ else {
57
+ currentSpinner.warn();
58
+ }
59
+ currentSpinner = null;
60
+ }
61
+ };
62
+ exports.warnSpinner = warnSpinner;
63
+ const infoSpinner = (text) => {
64
+ if (currentSpinner) {
65
+ if (text) {
66
+ currentSpinner.info(chalk_1.default.blue(text));
67
+ }
68
+ else {
69
+ currentSpinner.info();
70
+ }
71
+ currentSpinner = null;
72
+ }
73
+ };
74
+ exports.infoSpinner = infoSpinner;
75
+ const stopSpinner = () => {
76
+ if (currentSpinner) {
77
+ currentSpinner.stop();
78
+ currentSpinner = null;
79
+ }
80
+ };
81
+ exports.stopSpinner = stopSpinner;
82
+ const logInfo = (message) => {
83
+ console.log(chalk_1.default.blue("ℹ"), chalk_1.default.blue(message));
84
+ };
85
+ exports.logInfo = logInfo;
86
+ const logSuccess = (message) => {
87
+ console.log(chalk_1.default.green("✔"), chalk_1.default.green(message));
88
+ };
89
+ exports.logSuccess = logSuccess;
90
+ const logError = (message) => {
91
+ console.log(chalk_1.default.red("✖"), chalk_1.default.red(message));
92
+ };
93
+ exports.logError = logError;
94
+ const logWarning = (message) => {
95
+ console.log(chalk_1.default.yellow("⚠"), chalk_1.default.yellow(message));
96
+ };
97
+ exports.logWarning = logWarning;
98
+ const logDim = (message) => {
99
+ console.log(chalk_1.default.dim(message));
100
+ };
101
+ exports.logDim = logDim;
102
+ const logBlank = () => {
103
+ console.log();
104
+ };
105
+ exports.logBlank = logBlank;
106
+ const showHeader = () => {
107
+ (0, exports.logBlank)();
108
+ console.log(chalk_1.default.cyan.bold("╔════════════════════════════════════════════════════╗"));
109
+ console.log(chalk_1.default.cyan.bold("║") + chalk_1.default.white.bold(" Azure PIM CLI - Role Activation Manager ") + chalk_1.default.cyan.bold("║"));
110
+ console.log(chalk_1.default.cyan.bold("╚════════════════════════════════════════════════════╝"));
111
+ (0, exports.logBlank)();
112
+ };
113
+ exports.showHeader = showHeader;
114
+ const showDivider = () => {
115
+ console.log(chalk_1.default.dim("─".repeat(54)));
116
+ };
117
+ exports.showDivider = showDivider;
118
+ const formatRole = (roleName, scopeDisplayName) => {
119
+ return `${chalk_1.default.white.bold(roleName)} ${chalk_1.default.dim("@")} ${chalk_1.default.cyan(scopeDisplayName)}`;
120
+ };
121
+ exports.formatRole = formatRole;
122
+ const formatActiveRole = (roleName, scopeDisplayName, subscriptionName, startDateTime) => {
123
+ const startDate = new Date(startDateTime).toLocaleString();
124
+ return `${chalk_1.default.white.bold(roleName)} ${chalk_1.default.dim("@")} ${chalk_1.default.cyan(scopeDisplayName)} ${chalk_1.default.dim(`(${subscriptionName})`)} ${chalk_1.default.dim(`[Started: ${startDate}]`)}`;
125
+ };
126
+ exports.formatActiveRole = formatActiveRole;
127
+ const formatSubscription = (displayName, subscriptionId) => {
128
+ return `${chalk_1.default.white.bold(displayName)} ${chalk_1.default.dim(`(${subscriptionId})`)}`;
129
+ };
130
+ exports.formatSubscription = formatSubscription;
131
+ const formatStatus = (status) => {
132
+ switch (status.toLowerCase()) {
133
+ case "approved":
134
+ case "provisioned":
135
+ case "activated":
136
+ return chalk_1.default.green.bold(`✔ ${status}`);
137
+ case "denied":
138
+ case "failed":
139
+ return chalk_1.default.red.bold(`✖ ${status}`);
140
+ case "pendingapproval":
141
+ case "pending":
142
+ return chalk_1.default.yellow.bold(`⏳ ${status}`);
143
+ default:
144
+ return chalk_1.default.blue.bold(`ℹ ${status}`);
145
+ }
146
+ };
147
+ exports.formatStatus = formatStatus;
148
+ const showSummary = (title, items) => {
149
+ const boxWidth = 54;
150
+ const titleWidth = Math.max(0, boxWidth - 4 - title.length);
151
+ (0, exports.logBlank)();
152
+ console.log(chalk_1.default.cyan.bold(`┌─ ${title} ${"─".repeat(titleWidth)}`));
153
+ items.forEach((item) => {
154
+ console.log(chalk_1.default.cyan("│ ") + chalk_1.default.dim(`${item.label}: `) + chalk_1.default.white(item.value));
155
+ });
156
+ console.log(chalk_1.default.cyan.bold("└" + "─".repeat(boxWidth)));
157
+ (0, exports.logBlank)();
158
+ };
159
+ exports.showSummary = showSummary;
160
+ const withSpinner = async (text, operation, successText, failText) => {
161
+ (0, exports.startSpinner)(text);
162
+ try {
163
+ const result = await operation();
164
+ if (successText) {
165
+ (0, exports.succeedSpinner)(successText);
166
+ }
167
+ else {
168
+ (0, exports.succeedSpinner)();
169
+ }
170
+ return result;
171
+ }
172
+ catch (error) {
173
+ if (failText) {
174
+ (0, exports.failSpinner)(failText);
175
+ }
176
+ else {
177
+ (0, exports.failSpinner)();
178
+ }
179
+ throw error;
180
+ }
181
+ };
182
+ exports.withSpinner = withSpinner;
183
+ //# sourceMappingURL=ui.js.map
package/dist/ui.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "azp-cli",
3
+ "version": "0.0.1",
4
+ "description": "Terminal app to manage Azure PIM role activations",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "azp": "./dist/index.js"
8
+ },
9
+ "keywords": [
10
+ "azure",
11
+ "pim",
12
+ "privileged-identity-management",
13
+ "cli",
14
+ "terminal"
15
+ ],
16
+ "author": {
17
+ "name": "Tapan Meena",
18
+ "email": "tapanmeena1998@gmail.com"
19
+ },
20
+ "license": "ISC",
21
+ "dependencies": {
22
+ "@azure/arm-authorization": "^9.0.0",
23
+ "@azure/arm-resources-subscriptions": "^2.1.0",
24
+ "@azure/identity": "^4.13.0",
25
+ "@microsoft/microsoft-graph-client": "^3.0.7",
26
+ "chalk": "^5.6.2",
27
+ "commander": "^14.0.2",
28
+ "inquirer": "^13.1.0",
29
+ "isomorphic-fetch": "^3.0.0",
30
+ "ora": "^9.0.0",
31
+ "uuid": "^13.0.0"
32
+ },
33
+ "devDependencies": {
34
+ "@types/inquirer": "^9.0.9",
35
+ "@types/node": "^25.0.6",
36
+ "esbuild": "^0.27.2",
37
+ "ts-node": "^10.9.2",
38
+ "tsconfig-paths": "^4.2.0",
39
+ "typescript": "^5.9.3"
40
+ },
41
+ "scripts": {
42
+ "build": "tsc",
43
+ "start": "node dist/index.js",
44
+ "dev": "ts-node -r tsconfig-paths/register src/index.ts",
45
+ "lint": "eslint . --ext .ts"
46
+ }
47
+ }
@@ -0,0 +1,2 @@
1
+ onlyBuiltDependencies:
2
+ - esbuild
package/src/auth.ts ADDED
@@ -0,0 +1,66 @@
1
+ import { AzureCliCredential } from "@azure/identity";
2
+ import { Client } from "@microsoft/microsoft-graph-client";
3
+ import { TokenCredentialAuthenticationProvider } from "@microsoft/microsoft-graph-client/authProviders/azureTokenCredentials";
4
+ import { failSpinner, showSummary, startSpinner, succeedSpinner } from "./ui";
5
+
6
+ const GRAPH_SCOPES = ["https://graph.microsoft.com/.default"];
7
+
8
+ const ARM_SCOPES = ["https://management.azure.com/.default"];
9
+
10
+ export interface AuthContext {
11
+ credential: AzureCliCredential;
12
+ graphClient: Client;
13
+ userId: string;
14
+ userPrincipalName: string;
15
+ }
16
+
17
+ let cachedCredential: AzureCliCredential | null = null;
18
+
19
+ const getCredential = (): AzureCliCredential => {
20
+ if (!cachedCredential) {
21
+ cachedCredential = new AzureCliCredential();
22
+ }
23
+ return cachedCredential;
24
+ };
25
+
26
+ export const authenticate = async (): Promise<AuthContext> => {
27
+ startSpinner("Authenticating with Azure CLI...");
28
+
29
+ try {
30
+ const credential = getCredential();
31
+
32
+ // Create Microsoft Graph client
33
+ const authProvider = new TokenCredentialAuthenticationProvider(credential, { scopes: GRAPH_SCOPES });
34
+
35
+ const graphClient = Client.initWithMiddleware({ authProvider, defaultVersion: "v1.0" });
36
+
37
+ // Get user details
38
+ const user = await graphClient.api("/me").header("Accept-Language", "en-US").select("id,userPrincipalName,displayName").get();
39
+ const userId = user.id;
40
+ const userPrincipalName = user.userPrincipalName;
41
+
42
+ succeedSpinner("Authentication successful");
43
+ showSummary("User Information", [
44
+ { label: "Name", value: user.displayName },
45
+ { label: "Email", value: userPrincipalName },
46
+ ]);
47
+
48
+ return {
49
+ credential,
50
+ graphClient,
51
+ userId,
52
+ userPrincipalName,
53
+ };
54
+ } catch (error) {
55
+ failSpinner("Authentication failed");
56
+ throw error;
57
+ }
58
+ };
59
+
60
+ export const getArmToken = async (credential: AzureCliCredential): Promise<string> => {
61
+ const tokenResponse = await credential.getToken(ARM_SCOPES);
62
+ if (!tokenResponse) {
63
+ throw new Error("Failed to acquire ARM token");
64
+ }
65
+ return tokenResponse.token;
66
+ };