@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.
Files changed (125) hide show
  1. package/LICENSE.txt +661 -0
  2. package/README.md +244 -0
  3. package/dist/cjs/actions/action.d.ts +68 -0
  4. package/dist/cjs/actions/action.d.ts.map +1 -0
  5. package/dist/cjs/actions/action.js +41 -0
  6. package/dist/cjs/actions/action.js.map +1 -0
  7. package/dist/cjs/conditions/condition.d.ts +62 -0
  8. package/dist/cjs/conditions/condition.d.ts.map +1 -0
  9. package/dist/cjs/conditions/condition.js +43 -0
  10. package/dist/cjs/conditions/condition.js.map +1 -0
  11. package/dist/cjs/conditions/conditionOperation.d.ts +31 -0
  12. package/dist/cjs/conditions/conditionOperation.d.ts.map +1 -0
  13. package/dist/cjs/conditions/conditionOperation.js +39 -0
  14. package/dist/cjs/conditions/conditionOperation.js.map +1 -0
  15. package/dist/cjs/index.d.ts +13 -0
  16. package/dist/cjs/index.d.ts.map +1 -0
  17. package/dist/cjs/index.js +22 -0
  18. package/dist/cjs/index.js.map +1 -0
  19. package/dist/cjs/lint/lint.d.ts +41 -0
  20. package/dist/cjs/lint/lint.d.ts.map +1 -0
  21. package/dist/cjs/lint/lint.js +190 -0
  22. package/dist/cjs/lint/lint.js.map +1 -0
  23. package/dist/cjs/package.json +3 -0
  24. package/dist/cjs/parser.d.ts +13 -0
  25. package/dist/cjs/parser.d.ts.map +1 -0
  26. package/dist/cjs/parser.js +22 -0
  27. package/dist/cjs/parser.js.map +1 -0
  28. package/dist/cjs/policies/policy.d.ts +41 -0
  29. package/dist/cjs/policies/policy.d.ts.map +1 -0
  30. package/dist/cjs/policies/policy.js +40 -0
  31. package/dist/cjs/policies/policy.js.map +1 -0
  32. package/dist/cjs/principals/principal.d.ts +122 -0
  33. package/dist/cjs/principals/principal.d.ts.map +1 -0
  34. package/dist/cjs/principals/principal.js +101 -0
  35. package/dist/cjs/principals/principal.js.map +1 -0
  36. package/dist/cjs/resources/resource.d.ts +60 -0
  37. package/dist/cjs/resources/resource.d.ts.map +1 -0
  38. package/dist/cjs/resources/resource.js +56 -0
  39. package/dist/cjs/resources/resource.js.map +1 -0
  40. package/dist/cjs/statements/statement.d.ts +227 -0
  41. package/dist/cjs/statements/statement.d.ts.map +1 -0
  42. package/dist/cjs/statements/statement.js +236 -0
  43. package/dist/cjs/statements/statement.js.map +1 -0
  44. package/dist/cjs/utils.d.ts +55 -0
  45. package/dist/cjs/utils.d.ts.map +1 -0
  46. package/dist/cjs/utils.js +100 -0
  47. package/dist/cjs/utils.js.map +1 -0
  48. package/dist/cjs/validate/testutil.d.ts +3 -0
  49. package/dist/cjs/validate/testutil.d.ts.map +1 -0
  50. package/dist/cjs/validate/testutil.js +21 -0
  51. package/dist/cjs/validate/testutil.js.map +1 -0
  52. package/dist/cjs/validate/validate.d.ts +16 -0
  53. package/dist/cjs/validate/validate.d.ts.map +1 -0
  54. package/dist/cjs/validate/validate.js +361 -0
  55. package/dist/cjs/validate/validate.js.map +1 -0
  56. package/dist/cjs/validate/validateTypes.d.ts +53 -0
  57. package/dist/cjs/validate/validateTypes.d.ts.map +1 -0
  58. package/dist/cjs/validate/validateTypes.js +224 -0
  59. package/dist/cjs/validate/validateTypes.js.map +1 -0
  60. package/dist/cjs/validatedPolicy.d.ts +40 -0
  61. package/dist/cjs/validatedPolicy.d.ts.map +1 -0
  62. package/dist/cjs/validatedPolicy.js +30 -0
  63. package/dist/cjs/validatedPolicy.js.map +1 -0
  64. package/dist/esm/actions/action.d.ts +68 -0
  65. package/dist/esm/actions/action.d.ts.map +1 -0
  66. package/dist/esm/actions/action.js +35 -0
  67. package/dist/esm/actions/action.js.map +1 -0
  68. package/dist/esm/conditions/condition.d.ts +62 -0
  69. package/dist/esm/conditions/condition.d.ts.map +1 -0
  70. package/dist/esm/conditions/condition.js +35 -0
  71. package/dist/esm/conditions/condition.js.map +1 -0
  72. package/dist/esm/conditions/conditionOperation.d.ts +31 -0
  73. package/dist/esm/conditions/conditionOperation.d.ts.map +1 -0
  74. package/dist/esm/conditions/conditionOperation.js +34 -0
  75. package/dist/esm/conditions/conditionOperation.js.map +1 -0
  76. package/dist/esm/index.d.ts +13 -0
  77. package/dist/esm/index.d.ts.map +1 -0
  78. package/dist/esm/index.js +6 -0
  79. package/dist/esm/index.js.map +1 -0
  80. package/dist/esm/lint/lint.d.ts +41 -0
  81. package/dist/esm/lint/lint.d.ts.map +1 -0
  82. package/dist/esm/lint/lint.js +184 -0
  83. package/dist/esm/lint/lint.js.map +1 -0
  84. package/dist/esm/package.json +3 -0
  85. package/dist/esm/parser.d.ts +13 -0
  86. package/dist/esm/parser.d.ts.map +1 -0
  87. package/dist/esm/parser.js +19 -0
  88. package/dist/esm/parser.js.map +1 -0
  89. package/dist/esm/policies/policy.d.ts +41 -0
  90. package/dist/esm/policies/policy.d.ts.map +1 -0
  91. package/dist/esm/policies/policy.js +34 -0
  92. package/dist/esm/policies/policy.js.map +1 -0
  93. package/dist/esm/principals/principal.d.ts +122 -0
  94. package/dist/esm/principals/principal.d.ts.map +1 -0
  95. package/dist/esm/principals/principal.js +95 -0
  96. package/dist/esm/principals/principal.js.map +1 -0
  97. package/dist/esm/resources/resource.d.ts +60 -0
  98. package/dist/esm/resources/resource.d.ts.map +1 -0
  99. package/dist/esm/resources/resource.js +50 -0
  100. package/dist/esm/resources/resource.js.map +1 -0
  101. package/dist/esm/statements/statement.d.ts +227 -0
  102. package/dist/esm/statements/statement.d.ts.map +1 -0
  103. package/dist/esm/statements/statement.js +229 -0
  104. package/dist/esm/statements/statement.js.map +1 -0
  105. package/dist/esm/utils.d.ts +55 -0
  106. package/dist/esm/utils.d.ts.map +1 -0
  107. package/dist/esm/utils.js +92 -0
  108. package/dist/esm/utils.js.map +1 -0
  109. package/dist/esm/validate/testutil.d.ts +3 -0
  110. package/dist/esm/validate/testutil.d.ts.map +1 -0
  111. package/dist/esm/validate/testutil.js +19 -0
  112. package/dist/esm/validate/testutil.js.map +1 -0
  113. package/dist/esm/validate/validate.d.ts +16 -0
  114. package/dist/esm/validate/validate.d.ts.map +1 -0
  115. package/dist/esm/validate/validate.js +358 -0
  116. package/dist/esm/validate/validate.js.map +1 -0
  117. package/dist/esm/validate/validateTypes.d.ts +53 -0
  118. package/dist/esm/validate/validateTypes.d.ts.map +1 -0
  119. package/dist/esm/validate/validateTypes.js +215 -0
  120. package/dist/esm/validate/validateTypes.js.map +1 -0
  121. package/dist/esm/validatedPolicy.d.ts +40 -0
  122. package/dist/esm/validatedPolicy.d.ts.map +1 -0
  123. package/dist/esm/validatedPolicy.js +26 -0
  124. package/dist/esm/validatedPolicy.js.map +1 -0
  125. 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
+ }