@actsecurity/iam-policy 0.1.109
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/LICENSE.txt +661 -0
- package/README.md +244 -0
- package/dist/cjs/actions/action.d.ts +68 -0
- package/dist/cjs/actions/action.d.ts.map +1 -0
- package/dist/cjs/actions/action.js +41 -0
- package/dist/cjs/actions/action.js.map +1 -0
- package/dist/cjs/conditions/condition.d.ts +62 -0
- package/dist/cjs/conditions/condition.d.ts.map +1 -0
- package/dist/cjs/conditions/condition.js +43 -0
- package/dist/cjs/conditions/condition.js.map +1 -0
- package/dist/cjs/conditions/conditionOperation.d.ts +31 -0
- package/dist/cjs/conditions/conditionOperation.d.ts.map +1 -0
- package/dist/cjs/conditions/conditionOperation.js +39 -0
- package/dist/cjs/conditions/conditionOperation.js.map +1 -0
- package/dist/cjs/index.d.ts +13 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +22 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/lint/lint.d.ts +41 -0
- package/dist/cjs/lint/lint.d.ts.map +1 -0
- package/dist/cjs/lint/lint.js +190 -0
- package/dist/cjs/lint/lint.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/parser.d.ts +13 -0
- package/dist/cjs/parser.d.ts.map +1 -0
- package/dist/cjs/parser.js +22 -0
- package/dist/cjs/parser.js.map +1 -0
- package/dist/cjs/policies/policy.d.ts +41 -0
- package/dist/cjs/policies/policy.d.ts.map +1 -0
- package/dist/cjs/policies/policy.js +40 -0
- package/dist/cjs/policies/policy.js.map +1 -0
- package/dist/cjs/principals/principal.d.ts +122 -0
- package/dist/cjs/principals/principal.d.ts.map +1 -0
- package/dist/cjs/principals/principal.js +101 -0
- package/dist/cjs/principals/principal.js.map +1 -0
- package/dist/cjs/resources/resource.d.ts +60 -0
- package/dist/cjs/resources/resource.d.ts.map +1 -0
- package/dist/cjs/resources/resource.js +56 -0
- package/dist/cjs/resources/resource.js.map +1 -0
- package/dist/cjs/statements/statement.d.ts +227 -0
- package/dist/cjs/statements/statement.d.ts.map +1 -0
- package/dist/cjs/statements/statement.js +236 -0
- package/dist/cjs/statements/statement.js.map +1 -0
- package/dist/cjs/utils.d.ts +55 -0
- package/dist/cjs/utils.d.ts.map +1 -0
- package/dist/cjs/utils.js +100 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/cjs/validate/testutil.d.ts +3 -0
- package/dist/cjs/validate/testutil.d.ts.map +1 -0
- package/dist/cjs/validate/testutil.js +21 -0
- package/dist/cjs/validate/testutil.js.map +1 -0
- package/dist/cjs/validate/validate.d.ts +16 -0
- package/dist/cjs/validate/validate.d.ts.map +1 -0
- package/dist/cjs/validate/validate.js +361 -0
- package/dist/cjs/validate/validate.js.map +1 -0
- package/dist/cjs/validate/validateTypes.d.ts +53 -0
- package/dist/cjs/validate/validateTypes.d.ts.map +1 -0
- package/dist/cjs/validate/validateTypes.js +224 -0
- package/dist/cjs/validate/validateTypes.js.map +1 -0
- package/dist/cjs/validatedPolicy.d.ts +40 -0
- package/dist/cjs/validatedPolicy.d.ts.map +1 -0
- package/dist/cjs/validatedPolicy.js +30 -0
- package/dist/cjs/validatedPolicy.js.map +1 -0
- package/dist/esm/actions/action.d.ts +68 -0
- package/dist/esm/actions/action.d.ts.map +1 -0
- package/dist/esm/actions/action.js +35 -0
- package/dist/esm/actions/action.js.map +1 -0
- package/dist/esm/conditions/condition.d.ts +62 -0
- package/dist/esm/conditions/condition.d.ts.map +1 -0
- package/dist/esm/conditions/condition.js +35 -0
- package/dist/esm/conditions/condition.js.map +1 -0
- package/dist/esm/conditions/conditionOperation.d.ts +31 -0
- package/dist/esm/conditions/conditionOperation.d.ts.map +1 -0
- package/dist/esm/conditions/conditionOperation.js +34 -0
- package/dist/esm/conditions/conditionOperation.js.map +1 -0
- package/dist/esm/index.d.ts +13 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lint/lint.d.ts +41 -0
- package/dist/esm/lint/lint.d.ts.map +1 -0
- package/dist/esm/lint/lint.js +184 -0
- package/dist/esm/lint/lint.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/parser.d.ts +13 -0
- package/dist/esm/parser.d.ts.map +1 -0
- package/dist/esm/parser.js +19 -0
- package/dist/esm/parser.js.map +1 -0
- package/dist/esm/policies/policy.d.ts +41 -0
- package/dist/esm/policies/policy.d.ts.map +1 -0
- package/dist/esm/policies/policy.js +34 -0
- package/dist/esm/policies/policy.js.map +1 -0
- package/dist/esm/principals/principal.d.ts +122 -0
- package/dist/esm/principals/principal.d.ts.map +1 -0
- package/dist/esm/principals/principal.js +95 -0
- package/dist/esm/principals/principal.js.map +1 -0
- package/dist/esm/resources/resource.d.ts +60 -0
- package/dist/esm/resources/resource.d.ts.map +1 -0
- package/dist/esm/resources/resource.js +50 -0
- package/dist/esm/resources/resource.js.map +1 -0
- package/dist/esm/statements/statement.d.ts +227 -0
- package/dist/esm/statements/statement.d.ts.map +1 -0
- package/dist/esm/statements/statement.js +229 -0
- package/dist/esm/statements/statement.js.map +1 -0
- package/dist/esm/utils.d.ts +55 -0
- package/dist/esm/utils.d.ts.map +1 -0
- package/dist/esm/utils.js +92 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/esm/validate/testutil.d.ts +3 -0
- package/dist/esm/validate/testutil.d.ts.map +1 -0
- package/dist/esm/validate/testutil.js +19 -0
- package/dist/esm/validate/testutil.js.map +1 -0
- package/dist/esm/validate/validate.d.ts +16 -0
- package/dist/esm/validate/validate.d.ts.map +1 -0
- package/dist/esm/validate/validate.js +358 -0
- package/dist/esm/validate/validate.js.map +1 -0
- package/dist/esm/validate/validateTypes.d.ts +53 -0
- package/dist/esm/validate/validateTypes.d.ts.map +1 -0
- package/dist/esm/validate/validateTypes.js +215 -0
- package/dist/esm/validate/validateTypes.js.map +1 -0
- package/dist/esm/validatedPolicy.d.ts +40 -0
- package/dist/esm/validatedPolicy.d.ts.map +1 -0
- package/dist/esm/validatedPolicy.js +26 -0
- package/dist/esm/validatedPolicy.js.map +1 -0
- package/package.json +114 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.lintPolicy = lintPolicy;
|
|
4
|
+
exports.lintResourcePolicy = lintResourcePolicy;
|
|
5
|
+
exports.findEmptyActions = findEmptyActions;
|
|
6
|
+
exports.findDuplicateSids = findDuplicateSids;
|
|
7
|
+
const validate_js_1 = require("../validate/validate.js");
|
|
8
|
+
const validateTypes_js_1 = require("../validate/validateTypes.js");
|
|
9
|
+
/**
|
|
10
|
+
* Lints an IAM policy document by running all syntax validation checks from
|
|
11
|
+
* {@link validatePolicySyntax} plus additional best-practice checks that AWS
|
|
12
|
+
* technically allows but that may indicate authoring mistakes.
|
|
13
|
+
*
|
|
14
|
+
* @param policyDocument - the raw policy document object to lint
|
|
15
|
+
* @param validationCallbacks - optional callbacks to customize validation behavior per policy type
|
|
16
|
+
* @returns an array of validation errors including both syntax errors and lint warnings
|
|
17
|
+
*/
|
|
18
|
+
function lintPolicy(policyDocument, validationCallbacks = {}) {
|
|
19
|
+
const allErrors = (0, validate_js_1.validatePolicySyntax)(policyDocument, validationCallbacks);
|
|
20
|
+
allErrors.push(...findDuplicateSids(policyDocument));
|
|
21
|
+
allErrors.push(...findEmptyActions(policyDocument));
|
|
22
|
+
return allErrors;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Lints a resource policy document. Runs the resource-policy syntax validation
|
|
26
|
+
* plus the generic lint rules and the resource-policy-specific check for
|
|
27
|
+
* statements missing both `Principal` and `NotPrincipal`. AWS accepts such
|
|
28
|
+
* statements syntactically, but they can never match a request.
|
|
29
|
+
*
|
|
30
|
+
* @param policyDocument - the raw resource policy document to lint
|
|
31
|
+
* @returns an array of validation errors including syntax errors and lint warnings
|
|
32
|
+
*/
|
|
33
|
+
function lintResourcePolicy(policyDocument) {
|
|
34
|
+
const errors = (0, validateTypes_js_1.validateResourcePolicy)(policyDocument);
|
|
35
|
+
errors.push(...findDuplicateSids(policyDocument));
|
|
36
|
+
errors.push(...findEmptyActions(policyDocument));
|
|
37
|
+
errors.push(...findStatementsWithoutPrincipal(policyDocument));
|
|
38
|
+
return errors;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Finds statements in a resource policy that have neither a `Principal` nor a
|
|
42
|
+
* `NotPrincipal` element. AWS accepts these syntactically but they can never
|
|
43
|
+
* match a request, which is almost always an authoring mistake.
|
|
44
|
+
*
|
|
45
|
+
* @param policyDocument - the raw resource policy document to check
|
|
46
|
+
* @returns an array of validation errors, one for each statement missing both Principal and NotPrincipal
|
|
47
|
+
*/
|
|
48
|
+
function findStatementsWithoutPrincipal(policyDocument) {
|
|
49
|
+
if (typeof policyDocument !== 'object' || policyDocument === null) {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
const rawStatements = policyDocument.Statement;
|
|
53
|
+
if (rawStatements === undefined) {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
const statements = Array.isArray(rawStatements) ? rawStatements : [rawStatements];
|
|
57
|
+
const isArray = Array.isArray(rawStatements);
|
|
58
|
+
const errors = [];
|
|
59
|
+
for (let i = 0; i < statements.length; i++) {
|
|
60
|
+
const statement = statements[i];
|
|
61
|
+
if (typeof statement !== 'object' || statement === null) {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (statement.Principal === undefined && statement.NotPrincipal === undefined) {
|
|
65
|
+
errors.push({
|
|
66
|
+
path: isArray ? `Statement[${i}]` : 'Statement',
|
|
67
|
+
message: 'One of Principal or NotPrincipal is required in a resource policy'
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return errors;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Checks a single action string for issues with the action part after the
|
|
75
|
+
* colon. Flags two cases:
|
|
76
|
+
* - Empty or whitespace-only action (e.g. "s3:" or "s3: ")
|
|
77
|
+
* - Action containing whitespace (e.g. "s3:GetObject " or "s3: GetObject")
|
|
78
|
+
*
|
|
79
|
+
* AWS technically allows these, but they almost always indicate authoring
|
|
80
|
+
* mistakes.
|
|
81
|
+
*
|
|
82
|
+
* @param action - the raw action string value
|
|
83
|
+
* @param path - the JSON-path location of this action in the policy document
|
|
84
|
+
* @returns an array of validation errors for any issues found
|
|
85
|
+
*/
|
|
86
|
+
function lintActionString(action, path) {
|
|
87
|
+
if (typeof action !== 'string') {
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
const colonIndex = action.indexOf(':');
|
|
91
|
+
if (colonIndex === -1 || action.indexOf(':', colonIndex + 1) !== -1) {
|
|
92
|
+
return [];
|
|
93
|
+
}
|
|
94
|
+
const actionName = action.slice(colonIndex + 1);
|
|
95
|
+
if (actionName.trim().length === 0) {
|
|
96
|
+
return [
|
|
97
|
+
{
|
|
98
|
+
path,
|
|
99
|
+
message: 'Action is empty for the service'
|
|
100
|
+
}
|
|
101
|
+
];
|
|
102
|
+
}
|
|
103
|
+
if (actionName !== actionName.trim()) {
|
|
104
|
+
return [
|
|
105
|
+
{
|
|
106
|
+
path,
|
|
107
|
+
message: 'Action contains whitespace'
|
|
108
|
+
}
|
|
109
|
+
];
|
|
110
|
+
}
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Finds actions in a policy document that have the format "service:" — a
|
|
115
|
+
* service prefix followed by a colon but no action name. AWS allows this
|
|
116
|
+
* but it likely indicates an authoring mistake.
|
|
117
|
+
*
|
|
118
|
+
* @param policyDocument - the raw policy document object to check
|
|
119
|
+
* @returns an array of validation errors, one for each action that has an empty action part
|
|
120
|
+
*/
|
|
121
|
+
function findEmptyActions(policyDocument) {
|
|
122
|
+
if (typeof policyDocument !== 'object' || policyDocument === null) {
|
|
123
|
+
return [];
|
|
124
|
+
}
|
|
125
|
+
const statements = Array.isArray(policyDocument.Statement)
|
|
126
|
+
? policyDocument.Statement
|
|
127
|
+
: policyDocument.Statement !== undefined
|
|
128
|
+
? [policyDocument.Statement]
|
|
129
|
+
: [];
|
|
130
|
+
const errors = [];
|
|
131
|
+
for (let i = 0; i < statements.length; i++) {
|
|
132
|
+
const statement = statements[i];
|
|
133
|
+
if (typeof statement !== 'object' || statement === null) {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const basePath = Array.isArray(policyDocument.Statement) ? `Statement[${i}]` : 'Statement';
|
|
137
|
+
for (const field of ['Action', 'NotAction']) {
|
|
138
|
+
const value = statement[field];
|
|
139
|
+
if (value === undefined) {
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const fieldPath = `${basePath}.${field}`;
|
|
143
|
+
if (typeof value === 'string') {
|
|
144
|
+
errors.push(...lintActionString(value, fieldPath));
|
|
145
|
+
}
|
|
146
|
+
else if (Array.isArray(value)) {
|
|
147
|
+
for (let j = 0; j < value.length; j++) {
|
|
148
|
+
errors.push(...lintActionString(value[j], `${fieldPath}[${j}]`));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return errors;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Finds duplicate Statement Ids (Sid) within a policy document.
|
|
157
|
+
*
|
|
158
|
+
* AWS allows duplicate Sids in resource policies, but they can indicate
|
|
159
|
+
* copy-paste mistakes or authoring errors.
|
|
160
|
+
*
|
|
161
|
+
* @param policyDocument - the raw policy document object to check
|
|
162
|
+
* @returns an array of validation errors, one for each statement that shares a duplicate Sid
|
|
163
|
+
*/
|
|
164
|
+
function findDuplicateSids(policyDocument) {
|
|
165
|
+
if (typeof policyDocument !== 'object' || !Array.isArray(policyDocument?.Statement)) {
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
168
|
+
const statementIdCounts = policyDocument.Statement.reduce((acc, statement, index) => {
|
|
169
|
+
if (statement.Sid) {
|
|
170
|
+
if (!acc[statement.Sid]) {
|
|
171
|
+
acc[statement.Sid] = [];
|
|
172
|
+
}
|
|
173
|
+
acc[statement.Sid].push(`Statement[${index}].Sid`);
|
|
174
|
+
}
|
|
175
|
+
return acc;
|
|
176
|
+
}, {});
|
|
177
|
+
const errors = [];
|
|
178
|
+
for (const [, paths] of Object.entries(statementIdCounts)) {
|
|
179
|
+
if (paths.length > 1) {
|
|
180
|
+
for (const path of paths) {
|
|
181
|
+
errors.push({
|
|
182
|
+
path,
|
|
183
|
+
message: `Statement Ids (Sid) must be unique`
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return errors;
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=lint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../../src/lint/lint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Policy } from './policies/policy.js';
|
|
2
|
+
/**
|
|
3
|
+
* Load a Policy from a policy document. If a {@link ValidatedPolicy} is passed,
|
|
4
|
+
* the raw document and metadata are extracted from it automatically. When both
|
|
5
|
+
* the ValidatedPolicy carries metadata and the caller supplies explicit metadata,
|
|
6
|
+
* the explicit metadata takes precedence.
|
|
7
|
+
*
|
|
8
|
+
* @param policyDocument the policy document JSON object, or a ValidatedPolicy
|
|
9
|
+
* @param metadata optional metadata to attach to the loaded Policy
|
|
10
|
+
* @returns the Policy object for the backing policy document
|
|
11
|
+
*/
|
|
12
|
+
export declare function loadPolicy<T = undefined>(policyDocument: any, metadata?: T): Policy<T>;
|
|
13
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAc,MAAM,sBAAsB,CAAA;AAG9D;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,CAAC,GAAG,SAAS,EAAE,cAAc,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAKtF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadPolicy = loadPolicy;
|
|
4
|
+
const policy_js_1 = require("./policies/policy.js");
|
|
5
|
+
const validatedPolicy_js_1 = require("./validatedPolicy.js");
|
|
6
|
+
/**
|
|
7
|
+
* Load a Policy from a policy document. If a {@link ValidatedPolicy} is passed,
|
|
8
|
+
* the raw document and metadata are extracted from it automatically. When both
|
|
9
|
+
* the ValidatedPolicy carries metadata and the caller supplies explicit metadata,
|
|
10
|
+
* the explicit metadata takes precedence.
|
|
11
|
+
*
|
|
12
|
+
* @param policyDocument the policy document JSON object, or a ValidatedPolicy
|
|
13
|
+
* @param metadata optional metadata to attach to the loaded Policy
|
|
14
|
+
* @returns the Policy object for the backing policy document
|
|
15
|
+
*/
|
|
16
|
+
function loadPolicy(policyDocument, metadata) {
|
|
17
|
+
if ((0, validatedPolicy_js_1.isValidatedPolicy)(policyDocument)) {
|
|
18
|
+
return new policy_js_1.PolicyImpl(policyDocument.policyDocument, metadata ?? policyDocument.metadata);
|
|
19
|
+
}
|
|
20
|
+
return new policy_js_1.PolicyImpl(policyDocument, metadata);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":";;AAaA,gCAKC;AAlBD,oDAA8D;AAC9D,6DAAwD;AAExD;;;;;;;;;GASG;AACH,SAAgB,UAAU,CAAgB,cAAmB,EAAE,QAAY;IACzE,IAAI,IAAA,sCAAiB,EAAC,cAAc,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,sBAAU,CAAC,cAAc,CAAC,cAAc,EAAE,QAAQ,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAA;IAC3F,CAAC;IACD,OAAO,IAAI,sBAAU,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAA;AACjD,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type Statement } from '../statements/statement.js';
|
|
2
|
+
export interface Policy<T = undefined> {
|
|
3
|
+
/**
|
|
4
|
+
* The version of the policy
|
|
5
|
+
*/
|
|
6
|
+
version(): string | undefined;
|
|
7
|
+
/**
|
|
8
|
+
* The ID of the policy
|
|
9
|
+
*/
|
|
10
|
+
id(): string | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* The statements in the policy
|
|
13
|
+
*/
|
|
14
|
+
statements(): Statement[];
|
|
15
|
+
/**
|
|
16
|
+
* Whether the statement is an array
|
|
17
|
+
*/
|
|
18
|
+
statementIsArray(): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* The raw policy object as JSON
|
|
21
|
+
*/
|
|
22
|
+
toJSON(): any;
|
|
23
|
+
/**
|
|
24
|
+
* Metadata is any object to store additional information about the policy.
|
|
25
|
+
* Up to you as a user to define the type of the metadata and is optional.
|
|
26
|
+
*/
|
|
27
|
+
metadata(): T;
|
|
28
|
+
}
|
|
29
|
+
export declare class PolicyImpl<T = undefined> implements Policy<T> {
|
|
30
|
+
private readonly policyObject;
|
|
31
|
+
private readonly theMetadata?;
|
|
32
|
+
constructor(policyObject: any, theMetadata?: T | undefined);
|
|
33
|
+
version(): string | undefined;
|
|
34
|
+
id(): string | undefined;
|
|
35
|
+
statements(): Statement[];
|
|
36
|
+
private newStatements;
|
|
37
|
+
statementIsArray(): boolean;
|
|
38
|
+
toJSON(): any;
|
|
39
|
+
metadata(): T;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../src/policies/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,4BAA4B,CAAA;AAE1E,MAAM,WAAW,MAAM,CAAC,CAAC,GAAG,SAAS;IACnC;;OAEG;IACH,OAAO,IAAI,MAAM,GAAG,SAAS,CAAA;IAE7B;;OAEG;IACH,EAAE,IAAI,MAAM,GAAG,SAAS,CAAA;IAExB;;OAEG;IACH,UAAU,IAAI,SAAS,EAAE,CAAA;IAEzB;;OAEG;IACH,gBAAgB,IAAI,OAAO,CAAA;IAE3B;;OAEG;IACH,MAAM,IAAI,GAAG,CAAA;IAEb;;;OAGG;IACH,QAAQ,IAAI,CAAC,CAAA;CACd;AAED,qBAAa,UAAU,CAAC,CAAC,GAAG,SAAS,CAAE,YAAW,MAAM,CAAC,CAAC,CAAC;IAEvD,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;gBADZ,YAAY,EAAE,GAAG,EACjB,WAAW,CAAC,EAAE,CAAC,YAAA;IAG3B,OAAO,IAAI,MAAM,GAAG,SAAS;IAI7B,EAAE,IAAI,MAAM,GAAG,SAAS;IAIxB,UAAU,IAAI,SAAS,EAAE;IAIhC,OAAO,CAAC,aAAa;IASd,gBAAgB,IAAI,OAAO;IAI3B,MAAM,IAAI,GAAG;IAIb,QAAQ,IAAI,CAAC;CAGrB"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PolicyImpl = void 0;
|
|
4
|
+
const statement_js_1 = require("../statements/statement.js");
|
|
5
|
+
class PolicyImpl {
|
|
6
|
+
policyObject;
|
|
7
|
+
theMetadata;
|
|
8
|
+
constructor(policyObject, theMetadata) {
|
|
9
|
+
this.policyObject = policyObject;
|
|
10
|
+
this.theMetadata = theMetadata;
|
|
11
|
+
}
|
|
12
|
+
version() {
|
|
13
|
+
return this.policyObject.Version;
|
|
14
|
+
}
|
|
15
|
+
id() {
|
|
16
|
+
return this.policyObject.Id;
|
|
17
|
+
}
|
|
18
|
+
statements() {
|
|
19
|
+
return this.newStatements();
|
|
20
|
+
}
|
|
21
|
+
newStatements() {
|
|
22
|
+
if (!this.statementIsArray()) {
|
|
23
|
+
return [new statement_js_1.StatementImpl(this.policyObject.Statement, 1, { path: 'Statement' })];
|
|
24
|
+
}
|
|
25
|
+
return [this.policyObject.Statement].flat().map((statement, index) => {
|
|
26
|
+
return new statement_js_1.StatementImpl(statement, index + 1, { path: `Statement[${index}]` });
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
statementIsArray() {
|
|
30
|
+
return Array.isArray(this.policyObject.Statement);
|
|
31
|
+
}
|
|
32
|
+
toJSON() {
|
|
33
|
+
return this.policyObject;
|
|
34
|
+
}
|
|
35
|
+
metadata() {
|
|
36
|
+
return this.theMetadata;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.PolicyImpl = PolicyImpl;
|
|
40
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/policies/policy.ts"],"names":[],"mappings":";;;AAAA,6DAA0E;AAmC1E,MAAa,UAAU;IAEF;IACA;IAFnB,YACmB,YAAiB,EACjB,WAAe;QADf,iBAAY,GAAZ,YAAY,CAAK;QACjB,gBAAW,GAAX,WAAW,CAAI;IAC/B,CAAC;IAEG,OAAO;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAA;IAClC,CAAC;IAEM,EAAE;QACP,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,CAAA;IAC7B,CAAC;IAEM,UAAU;QACf,OAAO,IAAI,CAAC,aAAa,EAAE,CAAA;IAC7B,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,4BAAa,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAA;QACnF,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,SAAc,EAAE,KAAK,EAAE,EAAE;YACxE,OAAO,IAAI,4BAAa,CAAC,SAAS,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,aAAa,KAAK,GAAG,EAAE,CAAC,CAAA;QACjF,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,gBAAgB;QACrB,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;IACnD,CAAC;IAEM,MAAM;QACX,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAEM,QAAQ;QACb,OAAO,IAAI,CAAC,WAAgB,CAAA;IAC9B,CAAC;CACF;AAtCD,gCAsCC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
export type PrincipalType = 'AWS' | 'Service' | 'Federated' | 'CanonicalUser';
|
|
2
|
+
/**
|
|
3
|
+
* A Principal in a policy statement
|
|
4
|
+
*/
|
|
5
|
+
export interface Principal {
|
|
6
|
+
/**
|
|
7
|
+
* The type of principal, such as "AWS", "Service", "Federated", "CanonicalUser"
|
|
8
|
+
*/
|
|
9
|
+
type(): PrincipalType;
|
|
10
|
+
/**
|
|
11
|
+
* The raw string of the principal
|
|
12
|
+
*/
|
|
13
|
+
value(): string;
|
|
14
|
+
/**
|
|
15
|
+
* Whether the principal is a wildcard principal: `"*"`
|
|
16
|
+
*/
|
|
17
|
+
isWildcardPrincipal(): this is WildcardPrincipal;
|
|
18
|
+
/**
|
|
19
|
+
* Whether the principal is an AWS principal
|
|
20
|
+
*/
|
|
21
|
+
isServicePrincipal(): this is ServicePrincipal;
|
|
22
|
+
/**
|
|
23
|
+
* Whether the principal is an AWS principal that is not an account or wildcard principal
|
|
24
|
+
*/
|
|
25
|
+
isAwsPrincipal(): this is AwsPrincipal;
|
|
26
|
+
/**
|
|
27
|
+
* Whether the principal is a unique id principal
|
|
28
|
+
*/
|
|
29
|
+
isUniqueIdPrincipal(): this is UniqueIdPrincipal;
|
|
30
|
+
/**
|
|
31
|
+
* Whether the principal is a federated principal
|
|
32
|
+
*/
|
|
33
|
+
isFederatedPrincipal(): this is FederatedPrincipal;
|
|
34
|
+
/**
|
|
35
|
+
* Whether the principal is a canonical user principal
|
|
36
|
+
*/
|
|
37
|
+
isCanonicalUserPrincipal(): this is CanonicalUserPrincipal;
|
|
38
|
+
/**
|
|
39
|
+
* Whether the principal is an account principal
|
|
40
|
+
*/
|
|
41
|
+
isAccountPrincipal(): this is AccountPrincipal;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* A wildcard principal: `"*"`
|
|
45
|
+
*/
|
|
46
|
+
export interface WildcardPrincipal extends Principal {
|
|
47
|
+
/**
|
|
48
|
+
* The wildcard character `"*"`, this exists to differentiate between this interface and the Principal interface
|
|
49
|
+
*/
|
|
50
|
+
wildcard(): '*';
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* An AWS principal: `"arn:aws:iam::account-id:root"` or a 12 digit account id
|
|
54
|
+
*/
|
|
55
|
+
export interface AccountPrincipal extends Principal {
|
|
56
|
+
/**
|
|
57
|
+
* The 12 digit account id of the principal
|
|
58
|
+
*/
|
|
59
|
+
accountId(): string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* An AWS principal this is an ARN that is not an account or wildcard principal
|
|
63
|
+
*/
|
|
64
|
+
export interface AwsPrincipal extends Principal {
|
|
65
|
+
arn(): string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* An AWS principal that is a unique Id
|
|
69
|
+
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids
|
|
70
|
+
*/
|
|
71
|
+
export interface UniqueIdPrincipal extends Principal {
|
|
72
|
+
uniqueId(): string;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* An AWS principal that is a service principal: `"service"`
|
|
76
|
+
*/
|
|
77
|
+
export interface ServicePrincipal extends Principal {
|
|
78
|
+
/**
|
|
79
|
+
* The service the principal represents
|
|
80
|
+
*/
|
|
81
|
+
service(): string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* A federated principal
|
|
85
|
+
*/
|
|
86
|
+
export interface FederatedPrincipal extends Principal {
|
|
87
|
+
/**
|
|
88
|
+
* The id of the federated principal
|
|
89
|
+
*/
|
|
90
|
+
federated(): string;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* A canonical user principal
|
|
94
|
+
*/
|
|
95
|
+
export interface CanonicalUserPrincipal extends Principal {
|
|
96
|
+
/**
|
|
97
|
+
* The canonical user id of the principal
|
|
98
|
+
*/
|
|
99
|
+
canonicalUser(): string;
|
|
100
|
+
}
|
|
101
|
+
export declare class PrincipalImpl implements Principal, WildcardPrincipal, AccountPrincipal, UniqueIdPrincipal, AwsPrincipal, ServicePrincipal, FederatedPrincipal, CanonicalUserPrincipal {
|
|
102
|
+
private readonly principalType;
|
|
103
|
+
private readonly principalId;
|
|
104
|
+
constructor(principalType: PrincipalType, principalId: string);
|
|
105
|
+
value(): string;
|
|
106
|
+
type(): PrincipalType;
|
|
107
|
+
isWildcardPrincipal(): this is WildcardPrincipal;
|
|
108
|
+
isAccountPrincipal(): this is AccountPrincipal;
|
|
109
|
+
isUniqueIdPrincipal(): this is UniqueIdPrincipal;
|
|
110
|
+
isAwsPrincipal(): this is AwsPrincipal;
|
|
111
|
+
isServicePrincipal(): this is ServicePrincipal;
|
|
112
|
+
isFederatedPrincipal(): this is FederatedPrincipal;
|
|
113
|
+
isCanonicalUserPrincipal(): this is CanonicalUserPrincipal;
|
|
114
|
+
wildcard(): '*';
|
|
115
|
+
accountId(): string;
|
|
116
|
+
uniqueId(): string;
|
|
117
|
+
arn(): string;
|
|
118
|
+
service(): string;
|
|
119
|
+
federated(): string;
|
|
120
|
+
canonicalUser(): string;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=principal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"principal.d.ts","sourceRoot":"","sources":["../../../src/principals/principal.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,SAAS,GAAG,WAAW,GAAG,eAAe,CAAA;AAE7E;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,IAAI,IAAI,aAAa,CAAA;IAErB;;OAEG;IACH,KAAK,IAAI,MAAM,CAAA;IAEf;;OAEG;IACH,mBAAmB,IAAI,IAAI,IAAI,iBAAiB,CAAA;IAEhD;;OAEG;IACH,kBAAkB,IAAI,IAAI,IAAI,gBAAgB,CAAA;IAE9C;;OAEG;IACH,cAAc,IAAI,IAAI,IAAI,YAAY,CAAA;IAEtC;;OAEG;IACH,mBAAmB,IAAI,IAAI,IAAI,iBAAiB,CAAA;IAEhD;;OAEG;IACH,oBAAoB,IAAI,IAAI,IAAI,kBAAkB,CAAA;IAElD;;OAEG;IACH,wBAAwB,IAAI,IAAI,IAAI,sBAAsB,CAAA;IAE1D;;OAEG;IACH,kBAAkB,IAAI,IAAI,IAAI,gBAAgB,CAAA;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD;;OAEG;IACH,QAAQ,IAAI,GAAG,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD;;OAEG;IACH,SAAS,IAAI,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC7C,GAAG,IAAI,MAAM,CAAA;CACd;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD,QAAQ,IAAI,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD;;OAEG;IACH,OAAO,IAAI,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,SAAS;IACnD;;OAEG;IACH,SAAS,IAAI,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,SAAS;IACvD;;OAEG;IACH,aAAa,IAAI,MAAM,CAAA;CACxB;AAMD,qBAAa,aACX,YACE,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB;IAGtB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW;gBADX,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,MAAM;IAG/B,KAAK,IAAI,MAAM;IAIf,IAAI,IAAI,aAAa;IAIrB,mBAAmB,IAAI,IAAI,IAAI,iBAAiB;IAIhD,kBAAkB,IAAI,IAAI,IAAI,gBAAgB;IAO9C,mBAAmB,IAAI,IAAI,IAAI,iBAAiB;IAOhD,cAAc,IAAI,IAAI,IAAI,YAAY;IAYtC,kBAAkB,IAAI,IAAI,IAAI,gBAAgB;IAI9C,oBAAoB,IAAI,IAAI,IAAI,kBAAkB;IAIlD,wBAAwB,IAAI,IAAI,IAAI,sBAAsB;IAI1D,QAAQ,IAAI,GAAG;IASf,SAAS,IAAI,MAAM;IAYnB,QAAQ,IAAI,MAAM;IASlB,GAAG,IAAI,MAAM;IASb,OAAO,IAAI,MAAM;IASjB,SAAS,IAAI,MAAM;IASnB,aAAa,IAAI,MAAM;CAQ/B"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PrincipalImpl = void 0;
|
|
4
|
+
const utils_js_1 = require("../utils.js");
|
|
5
|
+
const accountIdRegex = /^[0-9]{12}$/;
|
|
6
|
+
const accountArnRegex = /^arn:.*?:iam::[0-9]{12}:root$/;
|
|
7
|
+
const uniqueIdRegex = /^A[0-9A-Z]+$/;
|
|
8
|
+
class PrincipalImpl {
|
|
9
|
+
principalType;
|
|
10
|
+
principalId;
|
|
11
|
+
constructor(principalType, principalId) {
|
|
12
|
+
this.principalType = principalType;
|
|
13
|
+
this.principalId = principalId;
|
|
14
|
+
}
|
|
15
|
+
value() {
|
|
16
|
+
return this.principalId;
|
|
17
|
+
}
|
|
18
|
+
type() {
|
|
19
|
+
return this.principalType;
|
|
20
|
+
}
|
|
21
|
+
isWildcardPrincipal() {
|
|
22
|
+
return this.principalType === 'AWS' && (0, utils_js_1.isAllWildcards)(this.principalId);
|
|
23
|
+
}
|
|
24
|
+
isAccountPrincipal() {
|
|
25
|
+
if (this.principalType !== 'AWS') {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
return accountIdRegex.test(this.principalId) || accountArnRegex.test(this.principalId);
|
|
29
|
+
}
|
|
30
|
+
isUniqueIdPrincipal() {
|
|
31
|
+
if (this.principalType !== 'AWS') {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
return uniqueIdRegex.test(this.principalId);
|
|
35
|
+
}
|
|
36
|
+
isAwsPrincipal() {
|
|
37
|
+
if (this.principalType !== 'AWS') {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
const anyThis = this;
|
|
41
|
+
return (!(0, utils_js_1.isAllWildcards)(anyThis.principalId) &&
|
|
42
|
+
!anyThis.isAccountPrincipal() &&
|
|
43
|
+
!anyThis.isUniqueIdPrincipal());
|
|
44
|
+
}
|
|
45
|
+
isServicePrincipal() {
|
|
46
|
+
return this.principalType === 'Service';
|
|
47
|
+
}
|
|
48
|
+
isFederatedPrincipal() {
|
|
49
|
+
return this.principalType === 'Federated';
|
|
50
|
+
}
|
|
51
|
+
isCanonicalUserPrincipal() {
|
|
52
|
+
return this.principalType === 'CanonicalUser';
|
|
53
|
+
}
|
|
54
|
+
wildcard() {
|
|
55
|
+
if (!this.isWildcardPrincipal()) {
|
|
56
|
+
throw new Error('Principal is not a wildcard principal, call isWildcardPrincipal() before calling wildcard()');
|
|
57
|
+
}
|
|
58
|
+
return '*';
|
|
59
|
+
}
|
|
60
|
+
accountId() {
|
|
61
|
+
if (!this.isAccountPrincipal()) {
|
|
62
|
+
throw new Error('Principal is not an account principal, call isAccountPrincipal() before calling accountId()');
|
|
63
|
+
}
|
|
64
|
+
if (accountArnRegex.test(this.principalId)) {
|
|
65
|
+
return (0, utils_js_1.delimitedSegmentAt)(this.principalId, ':', 4);
|
|
66
|
+
}
|
|
67
|
+
return this.principalId;
|
|
68
|
+
}
|
|
69
|
+
uniqueId() {
|
|
70
|
+
if (!this.isUniqueIdPrincipal()) {
|
|
71
|
+
throw new Error('Principal is not a unique id principal, call isUniqueIdPrincipal() before calling uniqueId()');
|
|
72
|
+
}
|
|
73
|
+
return this.principalId;
|
|
74
|
+
}
|
|
75
|
+
arn() {
|
|
76
|
+
if (!this.isAwsPrincipal()) {
|
|
77
|
+
throw new Error('Principal is not an AWS principal, call isAwsPrincipal() before calling arn()');
|
|
78
|
+
}
|
|
79
|
+
return this.principalId;
|
|
80
|
+
}
|
|
81
|
+
service() {
|
|
82
|
+
if (!this.isServicePrincipal()) {
|
|
83
|
+
throw new Error('Principal is not a service principal, call isServicePrincipal() before calling service()');
|
|
84
|
+
}
|
|
85
|
+
return this.principalId;
|
|
86
|
+
}
|
|
87
|
+
federated() {
|
|
88
|
+
if (this.principalType !== 'Federated') {
|
|
89
|
+
throw new Error('Principal is not a federated principal, call isFederatedPrincipal() before calling federated()');
|
|
90
|
+
}
|
|
91
|
+
return this.principalId;
|
|
92
|
+
}
|
|
93
|
+
canonicalUser() {
|
|
94
|
+
if (this.principalType !== 'CanonicalUser') {
|
|
95
|
+
throw new Error('Principal is not a canonical user principal, call isCanonicalUserPrincipal() before calling canonicalUser()');
|
|
96
|
+
}
|
|
97
|
+
return this.principalId;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.PrincipalImpl = PrincipalImpl;
|
|
101
|
+
//# sourceMappingURL=principal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"principal.js","sourceRoot":"","sources":["../../../src/principals/principal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A resource string in an IAM policy
|
|
3
|
+
*/
|
|
4
|
+
export interface Resource {
|
|
5
|
+
/**
|
|
6
|
+
* The raw string of the resource
|
|
7
|
+
*/
|
|
8
|
+
value(): string;
|
|
9
|
+
/**
|
|
10
|
+
* Whether the resource is all resources: `"*"`
|
|
11
|
+
*/
|
|
12
|
+
isAllResources(): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Whether the resource is an ARN resource
|
|
15
|
+
*/
|
|
16
|
+
isArnResource(): this is ArnResource;
|
|
17
|
+
/**
|
|
18
|
+
* The path to the resource in the policy document
|
|
19
|
+
*/
|
|
20
|
+
path(): string;
|
|
21
|
+
}
|
|
22
|
+
export interface ArnResource extends Resource {
|
|
23
|
+
/**
|
|
24
|
+
* The partition of the ARN
|
|
25
|
+
*/
|
|
26
|
+
partition(): string;
|
|
27
|
+
/**
|
|
28
|
+
* The service of the ARN
|
|
29
|
+
*/
|
|
30
|
+
service(): string;
|
|
31
|
+
/**
|
|
32
|
+
* The region of the ARN
|
|
33
|
+
*/
|
|
34
|
+
region(): string;
|
|
35
|
+
/**
|
|
36
|
+
* The account of the ARN
|
|
37
|
+
*/
|
|
38
|
+
account(): string;
|
|
39
|
+
/**
|
|
40
|
+
* The resource of the ARN
|
|
41
|
+
*/
|
|
42
|
+
resource(): string;
|
|
43
|
+
}
|
|
44
|
+
export declare class ResourceImpl implements Resource, ArnResource {
|
|
45
|
+
private readonly rawValue;
|
|
46
|
+
private readonly otherProps;
|
|
47
|
+
constructor(rawValue: string, otherProps: {
|
|
48
|
+
path: string;
|
|
49
|
+
});
|
|
50
|
+
path(): string;
|
|
51
|
+
partition(): string;
|
|
52
|
+
service(): string;
|
|
53
|
+
region(): string;
|
|
54
|
+
account(): string;
|
|
55
|
+
resource(): string;
|
|
56
|
+
value(): string;
|
|
57
|
+
isAllResources(): boolean;
|
|
58
|
+
isArnResource(): this is ArnResource;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../../../src/resources/resource.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,KAAK,IAAI,MAAM,CAAA;IAEf;;OAEG;IACH,cAAc,IAAI,OAAO,CAAA;IAEzB;;OAEG;IACH,aAAa,IAAI,IAAI,IAAI,WAAW,CAAA;IAEpC;;OAEG;IACH,IAAI,IAAI,MAAM,CAAA;CACf;AAED,MAAM,WAAW,WAAY,SAAQ,QAAQ;IAC3C;;OAEG;IACH,SAAS,IAAI,MAAM,CAAA;IAEnB;;OAEG;IACH,OAAO,IAAI,MAAM,CAAA;IAEjB;;OAEG;IACH,MAAM,IAAI,MAAM,CAAA;IAEhB;;OAEG;IACH,OAAO,IAAI,MAAM,CAAA;IAEjB;;OAEG;IACH,QAAQ,IAAI,MAAM,CAAA;CACnB;AAED,qBAAa,YAAa,YAAW,QAAQ,EAAE,WAAW;IAEtD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBADV,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE;QAC3B,IAAI,EAAE,MAAM,CAAA;KACb;IAGH,IAAI,IAAI,MAAM;IAId,SAAS,IAAI,MAAM;IASnB,OAAO,IAAI,MAAM;IASjB,MAAM,IAAI,MAAM;IAShB,OAAO,IAAI,MAAM;IASjB,QAAQ,IAAI,MAAM;IASlB,KAAK,IAAI,MAAM;IAIf,cAAc,IAAI,OAAO;IAIzB,aAAa,IAAI,IAAI,IAAI,WAAW;CAGrC"}
|