@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,215 @@
|
|
|
1
|
+
import { validatePolicySyntax } from './validate.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validates an Identity Policy attached to an IAM role or user, or managed policy
|
|
4
|
+
*
|
|
5
|
+
* @param policy the policy to validate
|
|
6
|
+
* @returns an array of validation errors
|
|
7
|
+
*/
|
|
8
|
+
export function validateIdentityPolicy(policy) {
|
|
9
|
+
return validatePolicySyntax(policy, {
|
|
10
|
+
validateStatement: (statement, path) => {
|
|
11
|
+
const policyType = 'an identity policy statement';
|
|
12
|
+
const errors = [];
|
|
13
|
+
errors.push(...validateProhibitedFields(statement, ['Principal', 'NotPrincipal'], path, policyType));
|
|
14
|
+
errors.push(...validateAtLeastOneOf(statement, ['Action', 'NotAction'], path, policyType));
|
|
15
|
+
errors.push(...validateAtLeastOneOf(statement, ['Resource', 'NotResource'], path, policyType));
|
|
16
|
+
return errors;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Validates a Service Control Policy (SCP)
|
|
22
|
+
*
|
|
23
|
+
* @param policy the policy to validate
|
|
24
|
+
* @returns an array of validation errors
|
|
25
|
+
*/
|
|
26
|
+
export function validateServiceControlPolicy(policy) {
|
|
27
|
+
const policyType = 'a service control policy';
|
|
28
|
+
return validatePolicySyntax(policy, {
|
|
29
|
+
validateStatement: (statement, path) => {
|
|
30
|
+
const errors = [];
|
|
31
|
+
errors.push(...validateProhibitedFields(statement, ['Principal', 'NotPrincipal'], path, policyType));
|
|
32
|
+
errors.push(...validateAtLeastOneOf(statement, ['Action', 'NotAction'], path, policyType));
|
|
33
|
+
errors.push(...validateAtLeastOneOf(statement, ['Resource', 'NotResource'], path, policyType));
|
|
34
|
+
return errors;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Validates a Resource Policy attached to an S3 bucket, SQS queue, or other resource. \
|
|
40
|
+
*
|
|
41
|
+
* This is very generic and will not be able to validate all resource policies.
|
|
42
|
+
*
|
|
43
|
+
* @param policy the policy to validate
|
|
44
|
+
* @returns an array of validation errors
|
|
45
|
+
*/
|
|
46
|
+
export function validateResourcePolicy(policy) {
|
|
47
|
+
return validatePolicySyntax(policy, {
|
|
48
|
+
validateStatement: (statement, path) => {
|
|
49
|
+
const policyType = 'a resource policy';
|
|
50
|
+
const errors = [];
|
|
51
|
+
errors.push(...validateAtLeastOneOf(statement, ['Action', 'NotAction'], path, policyType));
|
|
52
|
+
return errors;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Validates a Resource Control Policy (RCP)
|
|
58
|
+
*
|
|
59
|
+
* @param policy the policy to validate
|
|
60
|
+
* @returns an array of validation errors
|
|
61
|
+
*/
|
|
62
|
+
export function validateResourceControlPolicy(policy) {
|
|
63
|
+
const policyType = 'a resource control policy';
|
|
64
|
+
return validatePolicySyntax(policy, {
|
|
65
|
+
validateVersion: (version, path) => {
|
|
66
|
+
if (version !== '2012-10-17') {
|
|
67
|
+
return [
|
|
68
|
+
{
|
|
69
|
+
path: version === undefined ? path : `Version`,
|
|
70
|
+
message: `Version must be "2012-10-17" in ${policyType}`
|
|
71
|
+
}
|
|
72
|
+
];
|
|
73
|
+
}
|
|
74
|
+
return [];
|
|
75
|
+
},
|
|
76
|
+
validateStatement: (statement, path) => {
|
|
77
|
+
const errors = [];
|
|
78
|
+
if (statement.Effect !== 'Deny') {
|
|
79
|
+
errors.push({
|
|
80
|
+
path: `${path}.Effect`,
|
|
81
|
+
message: `Effect must be "Deny" in ${policyType}`
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
if (statement.Principal !== '*') {
|
|
85
|
+
errors.push({
|
|
86
|
+
path: statement.Principal == undefined ? path : `${path}.Principal`,
|
|
87
|
+
message: `Principal must be "*" in ${policyType}`
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
errors.push(...validateProhibitedFields(statement, ['NotPrincipal', 'NotAction'], path, policyType));
|
|
91
|
+
errors.push(...validateAtLeastOneOf(statement, ['Action'], path, policyType));
|
|
92
|
+
errors.push(...validateAtLeastOneOf(statement, ['Resource', 'NotResource'], path, policyType));
|
|
93
|
+
return errors;
|
|
94
|
+
},
|
|
95
|
+
validateAction: (action, path) => {
|
|
96
|
+
if (action === '*') {
|
|
97
|
+
return [
|
|
98
|
+
{
|
|
99
|
+
path,
|
|
100
|
+
message: `Action cannot be "*" in ${policyType}`
|
|
101
|
+
}
|
|
102
|
+
];
|
|
103
|
+
}
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Validates a Trust Policy attached to a role
|
|
110
|
+
*
|
|
111
|
+
* @param policy the policy to validate
|
|
112
|
+
* @returns an array of validation errors
|
|
113
|
+
*/
|
|
114
|
+
export function validateTrustPolicy(policy) {
|
|
115
|
+
return validatePolicySyntax(policy, {
|
|
116
|
+
validateStatement: (statement, path) => {
|
|
117
|
+
const policyType = 'a trust policy';
|
|
118
|
+
const errors = [];
|
|
119
|
+
errors.push(...validateProhibitedFields(statement, ['Resource', 'NotResource'], path, policyType));
|
|
120
|
+
errors.push(...validateAtLeastOneOf(statement, ['Action', 'NotAction'], path, policyType));
|
|
121
|
+
errors.push(...validateAtLeastOneOf(statement, ['Principal', 'NotPrincipal'], path, policyType));
|
|
122
|
+
return errors;
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Validates an VPC Endpoint Policy
|
|
128
|
+
*
|
|
129
|
+
* @param policy the policy to validate
|
|
130
|
+
* @returns an array of validation errors
|
|
131
|
+
*/
|
|
132
|
+
export function validateEndpointPolicy(policy) {
|
|
133
|
+
return validatePolicySyntax(policy, {
|
|
134
|
+
validateStatement: (statement, path) => {
|
|
135
|
+
const policyType = 'an endpoint policy';
|
|
136
|
+
const errors = [];
|
|
137
|
+
errors.push(...validateProhibitedFields(statement, ['NotPrincipal'], path, policyType));
|
|
138
|
+
errors.push(...validateAtLeastOneOf(statement, ['Action', 'NotAction'], path, policyType));
|
|
139
|
+
errors.push(...validateAtLeastOneOf(statement, ['Resource', 'NotResource'], path, policyType));
|
|
140
|
+
errors.push(...validateAtLeastOneOf(statement, ['Principal'], path, policyType));
|
|
141
|
+
if (statement.Principal && statement.Principal !== '*') {
|
|
142
|
+
errors.push({
|
|
143
|
+
message: `Principal must be "*" in ${policyType}`,
|
|
144
|
+
path: `${path}.Principal`
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
return errors;
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Validates a session policy
|
|
153
|
+
*
|
|
154
|
+
* @param policy the policy to validate
|
|
155
|
+
* @returns an array of validation errors
|
|
156
|
+
*/
|
|
157
|
+
export function validateSessionPolicy(policy) {
|
|
158
|
+
return validatePolicySyntax(policy, {
|
|
159
|
+
validateStatement: (statement, path) => {
|
|
160
|
+
const policyType = 'a session policy';
|
|
161
|
+
const errors = [];
|
|
162
|
+
errors.push(...validateProhibitedFields(statement, ['Principal', 'NotPrincipal'], path, policyType));
|
|
163
|
+
errors.push(...validateAtLeastOneOf(statement, ['Action', 'NotAction'], path, policyType));
|
|
164
|
+
errors.push(...validateAtLeastOneOf(statement, ['Resource', 'NotResource'], path, policyType));
|
|
165
|
+
return errors;
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Validates that at least one of the specified fields is present in a statement
|
|
171
|
+
*
|
|
172
|
+
* @param statement the statement to validate
|
|
173
|
+
* @param requiredFields the list of fields, that at least one must be present
|
|
174
|
+
* @param path the path to the statement in the policy
|
|
175
|
+
* @param policyType the type of policy being validated
|
|
176
|
+
* @returns an array of validation errors
|
|
177
|
+
*/
|
|
178
|
+
function validateAtLeastOneOf(statement, requiredFields, path, policyType) {
|
|
179
|
+
const presentFields = requiredFields.filter((field) => statement[field]);
|
|
180
|
+
let message = `One of ${requiredFields.join(' or ')} is required in ${policyType}`;
|
|
181
|
+
if (requiredFields.length === 1) {
|
|
182
|
+
message = `${requiredFields[0]} is required in ${policyType}`;
|
|
183
|
+
}
|
|
184
|
+
if (presentFields.length === 0) {
|
|
185
|
+
return [
|
|
186
|
+
{
|
|
187
|
+
path,
|
|
188
|
+
message
|
|
189
|
+
}
|
|
190
|
+
];
|
|
191
|
+
}
|
|
192
|
+
return [];
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Validates prohibited fields do not exist in a statement
|
|
196
|
+
*
|
|
197
|
+
* @param statement the statement to validate
|
|
198
|
+
* @param prohibitedFields the list of fields that are not allowed
|
|
199
|
+
* @param path the path to the statement in the policy
|
|
200
|
+
* @param policyType the type of policy being validated
|
|
201
|
+
* @returns an array of validation errors
|
|
202
|
+
*/
|
|
203
|
+
function validateProhibitedFields(statement, prohibitedFields, path, policyType) {
|
|
204
|
+
const errors = [];
|
|
205
|
+
for (const field of prohibitedFields) {
|
|
206
|
+
if (statement[field]) {
|
|
207
|
+
errors.push({
|
|
208
|
+
path: `${path}.#${field}`,
|
|
209
|
+
message: `${field} is not allowed in ${policyType}`
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return errors;
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=validateTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateTypes.js","sourceRoot":"","sources":["../../../src/validate/validateTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ValidationError } from './validate/validate.js';
|
|
2
|
+
/**
|
|
3
|
+
* A policy document that has been validated. Carries the raw policy document,
|
|
4
|
+
* optional metadata, and the validation result so that downstream consumers
|
|
5
|
+
* can skip re-validation.
|
|
6
|
+
*
|
|
7
|
+
* Every field is a plain value — no class instances — so the entire object
|
|
8
|
+
* survives JSON serialization (e.g. through SharedArrayBuffer) unchanged.
|
|
9
|
+
*/
|
|
10
|
+
export interface ValidatedPolicy<T = undefined> {
|
|
11
|
+
/** Discriminant for runtime detection via {@link isValidatedPolicy}. */
|
|
12
|
+
readonly __validated: true;
|
|
13
|
+
/** The raw policy JSON document. */
|
|
14
|
+
readonly policyDocument: any;
|
|
15
|
+
/** Optional metadata carried through to {@link loadPolicy} (e.g. `{ name: string }` for error reporting). */
|
|
16
|
+
readonly metadata?: T;
|
|
17
|
+
/** Validation errors. An empty array means the policy is valid. */
|
|
18
|
+
readonly errors: readonly ValidationError[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Validates a policy document using the provided validation function and
|
|
22
|
+
* bundles the result with the raw document and optional metadata.
|
|
23
|
+
*
|
|
24
|
+
* The caller chooses the validation function, so this factory is agnostic
|
|
25
|
+
* to the policy type (identity, SCP, RCP, resource, trust, endpoint, etc.).
|
|
26
|
+
*
|
|
27
|
+
* @param policyDocument the raw policy JSON document
|
|
28
|
+
* @param validateFn a validation function that returns an array of errors (empty if valid)
|
|
29
|
+
* @param metadata optional metadata to carry with the validated policy
|
|
30
|
+
* @returns a ValidatedPolicy containing the raw document, metadata, and validation errors
|
|
31
|
+
*/
|
|
32
|
+
export declare function createValidatedPolicy<T = undefined>(policyDocument: any, validateFn: (policy: any) => ValidationError[], metadata?: T): ValidatedPolicy<T>;
|
|
33
|
+
/**
|
|
34
|
+
* Type guard that checks whether a value is a {@link ValidatedPolicy}.
|
|
35
|
+
*
|
|
36
|
+
* @param value the value to check
|
|
37
|
+
* @returns true if the value is a ValidatedPolicy
|
|
38
|
+
*/
|
|
39
|
+
export declare function isValidatedPolicy(value: any): value is ValidatedPolicy;
|
|
40
|
+
//# sourceMappingURL=validatedPolicy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validatedPolicy.d.ts","sourceRoot":"","sources":["../../src/validatedPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAE7D;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,SAAS;IAC5C,wEAAwE;IACxE,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAA;IAE1B,oCAAoC;IACpC,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAA;IAE5B,6GAA6G;IAC7G,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAErB,mEAAmE;IACnE,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAA;CAC5C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,GAAG,SAAS,EACjD,cAAc,EAAE,GAAG,EACnB,UAAU,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,eAAe,EAAE,EAC9C,QAAQ,CAAC,EAAE,CAAC,GACX,eAAe,CAAC,CAAC,CAAC,CAGpB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,eAAe,CAEtE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates a policy document using the provided validation function and
|
|
3
|
+
* bundles the result with the raw document and optional metadata.
|
|
4
|
+
*
|
|
5
|
+
* The caller chooses the validation function, so this factory is agnostic
|
|
6
|
+
* to the policy type (identity, SCP, RCP, resource, trust, endpoint, etc.).
|
|
7
|
+
*
|
|
8
|
+
* @param policyDocument the raw policy JSON document
|
|
9
|
+
* @param validateFn a validation function that returns an array of errors (empty if valid)
|
|
10
|
+
* @param metadata optional metadata to carry with the validated policy
|
|
11
|
+
* @returns a ValidatedPolicy containing the raw document, metadata, and validation errors
|
|
12
|
+
*/
|
|
13
|
+
export function createValidatedPolicy(policyDocument, validateFn, metadata) {
|
|
14
|
+
const errors = validateFn(policyDocument);
|
|
15
|
+
return { __validated: true, policyDocument, metadata, errors };
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Type guard that checks whether a value is a {@link ValidatedPolicy}.
|
|
19
|
+
*
|
|
20
|
+
* @param value the value to check
|
|
21
|
+
* @returns true if the value is a ValidatedPolicy
|
|
22
|
+
*/
|
|
23
|
+
export function isValidatedPolicy(value) {
|
|
24
|
+
return !!value && value.__validated === true;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=validatedPolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validatedPolicy.js","sourceRoot":"","sources":["../../src/validatedPolicy.ts"],"names":[],"mappings":"AAwBA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CACnC,cAAmB,EACnB,UAA8C,EAC9C,QAAY;IAEZ,MAAM,MAAM,GAAG,UAAU,CAAC,cAAc,CAAC,CAAA;IACzC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;AAChE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAU;IAC1C,OAAO,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,CAAA;AAC9C,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@actsecurity/iam-policy",
|
|
3
|
+
"version": "0.1.109",
|
|
4
|
+
"description": "An ORM for AWS IAM policies",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/act-security-labs/iam-policy.git"
|
|
8
|
+
},
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/esm/index.js",
|
|
12
|
+
"require": "./dist/cjs/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist/**/*"
|
|
17
|
+
],
|
|
18
|
+
"types": "dist/cjs/index.d.ts",
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "npx tsc -p tsconfig.cjs.json && npx tsc -p tsconfig.esm.json && ./postbuild.sh",
|
|
21
|
+
"clean": "rm -rf dist",
|
|
22
|
+
"test": "npx vitest --run --coverage",
|
|
23
|
+
"release": "npm install && npm run clean && npm run build && npm test && npm run format-check && npm publish",
|
|
24
|
+
"format": "npx prettier --write src/",
|
|
25
|
+
"format-check": "npx prettier --check src/"
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"AWS",
|
|
29
|
+
"IAM"
|
|
30
|
+
],
|
|
31
|
+
"author": "Act Security",
|
|
32
|
+
"license": "AGPL-3.0-or-later",
|
|
33
|
+
"bugs": {
|
|
34
|
+
"url": "https://github.com/act-security-labs/iam-policy/issues"
|
|
35
|
+
},
|
|
36
|
+
"homepage": "https://github.com/act-security-labs/iam-policy#readme",
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@actsecurity/prettier-config": "^0.1.0",
|
|
39
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
40
|
+
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
41
|
+
"@semantic-release/exec": "^7.1.0",
|
|
42
|
+
"@semantic-release/git": "^10.0.1",
|
|
43
|
+
"@semantic-release/github": "^12.0.6",
|
|
44
|
+
"@semantic-release/npm": "^13.1.4",
|
|
45
|
+
"@semantic-release/release-notes-generator": "^14.0.3",
|
|
46
|
+
"@types/node": "^22.5.0",
|
|
47
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
48
|
+
"semantic-release": "^25.0.3",
|
|
49
|
+
"typescript": "^5.5.4",
|
|
50
|
+
"vitest": "^4.0.18"
|
|
51
|
+
},
|
|
52
|
+
"prettier": "@actsecurity/prettier-config",
|
|
53
|
+
"release": {
|
|
54
|
+
"branches": [
|
|
55
|
+
"main"
|
|
56
|
+
],
|
|
57
|
+
"plugins": [
|
|
58
|
+
[
|
|
59
|
+
"@semantic-release/commit-analyzer",
|
|
60
|
+
{
|
|
61
|
+
"releaseRules": [
|
|
62
|
+
{
|
|
63
|
+
"type": "feat",
|
|
64
|
+
"release": "patch"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"type": "fix",
|
|
68
|
+
"release": "patch"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"breaking": true,
|
|
72
|
+
"release": "patch"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"type": "*",
|
|
76
|
+
"release": "patch"
|
|
77
|
+
}
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
],
|
|
81
|
+
"@semantic-release/release-notes-generator",
|
|
82
|
+
"@semantic-release/changelog",
|
|
83
|
+
[
|
|
84
|
+
"@semantic-release/npm",
|
|
85
|
+
{
|
|
86
|
+
"npmPublish": true
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
[
|
|
90
|
+
"@semantic-release/exec",
|
|
91
|
+
{
|
|
92
|
+
"successCmd": "echo published=true >> $GITHUB_OUTPUT && echo version=${nextRelease.version} >> $GITHUB_OUTPUT && echo package_name=$(node -p \"require('./package.json').name\") >> $GITHUB_OUTPUT"
|
|
93
|
+
}
|
|
94
|
+
],
|
|
95
|
+
[
|
|
96
|
+
"@semantic-release/git",
|
|
97
|
+
{
|
|
98
|
+
"assets": [
|
|
99
|
+
"package.json",
|
|
100
|
+
"package-lock.json",
|
|
101
|
+
"CHANGELOG.md"
|
|
102
|
+
],
|
|
103
|
+
"message": "chore(release): ${nextRelease.version} [skip ci]"
|
|
104
|
+
}
|
|
105
|
+
],
|
|
106
|
+
[
|
|
107
|
+
"@semantic-release/github",
|
|
108
|
+
{
|
|
109
|
+
"assets": []
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
]
|
|
113
|
+
}
|
|
114
|
+
}
|