Add ActionState type and make some initial use of it#3990
Open
mbg wants to merge 14 commits into
Open
Conversation
Contributor
There was a problem hiding this comment.
Warning
- Copilot's review of this pull request may be incomplete because some of the changed files are excluded by your Copilot content exclusion settings. See Excluding content from Copilot for details.
Pull request overview
This PR introduces a new ActionState type (a type-level “state feature” system) and begins adopting it across several action entry points to reduce reliance on global state and improve testability. It also refactors getConfigFileInput to take ActionState and updates unit tests to use a new TestEnv harness.
Changes:
- Add
src/action-common.tswithActionState/feature typing plus a sharedrunInActionswrapper for action entry points. - Introduce an
Envabstraction (src/environment.ts+getEnvinsrc/util.ts) and start using typedActionsEnvVarsin some places. - Refactor
getConfigFileInputto depend onActionState(incl. feature flags) and update tests to use the newTestEnvhelper.
Show a summary per file
| File | Description |
|---|---|
| src/action-common.ts | Adds ActionState feature typing and runInActions wrapper used by multiple actions. |
| src/actions-util.ts | Introduces ActionsEnvVars enum and updates some env var reads to use it. |
| src/util.ts | Adds getEnv plus env var helpers that support dependency injection in tests. |
| src/environment.ts | Adds Env interface to abstract over process.env. |
| src/autobuild-action.ts | Converts wrapper to runInActions and injects logger via ActionState. |
| src/analyze-action.ts | Converts wrapper to runInActions and injects logger via ActionState. |
| src/init-action.ts | Converts wrapper to runInActions and passes ActionState into config file resolution. |
| src/setup-codeql-action.ts | Converts wrapper to runInActions and injects logger via ActionState. |
| src/upload-sarif-action.ts | Converts wrapper to runInActions and injects logger via ActionState. |
| src/config/file.ts | Refactors getConfigFileInput to accept ActionState and fetch the FF internally (async). |
| src/config/file.test.ts | Updates tests to use the new TestEnv/callee test harness. |
| src/testing-utils.ts | Adds TestEnv/callee, getTestEnv, and tightens default Actions env var typing. |
| src/api-client.ts | Uses ActionsEnvVars for some required env vars in API details creation. |
| lib/entry-points.js | Excluded (generated output); not reviewed per policy/instructions. |
Review details
Files excluded by content exclusion policy (1)
- lib/entry-points.js
- Files reviewed: 13/14 changed files
- Comments generated: 1
- Review effort level: Low
Comment on lines
+41
to
+49
| /** Constructs the union of all state types identifies by `Fs`. */ | ||
| export type FieldsOf<Fs extends readonly StateFeature[]> = Fs extends [] | ||
| ? BaseState | ||
| : Fs extends [ | ||
| infer Head extends StateFeature, | ||
| ...infer Tail extends StateFeature[], | ||
| ] | ||
| ? FeatureState[Head] & FieldsOf<Tail> | ||
| : never; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR extracts some changes from #3973 that add the new
ActionStatetype. TheActionStatetype is indexed (at the type-level) over the types of state a corresponding value provides (essentially providing a primitive state effect system). Concretely, this allows:ActionStatevalues can be propagated easily throughout the implementation.ActionStatevalues can easily be mocked in tests.ActionState, we will be able to run more tests in parallel in the future.ActionStatevalues can be passed to functions that require only a subset of features, but cannot use the features they don't declare.This PR adds the new type and surrounding infrastructure. It also updates some parts of the codebase to make use of it, but the goal of this PR is by no means to refactor the entire codebase to make use of
ActionStatevalues. The main example uses in this PR are:runInActionswrapper to de-duplicate common code for the different Actions' entry points.getConfigFileInputfollowing Add FF for configuration file repository property #3983 and making use of the newTestEnvframework for the corresponding tests.Notes for reviewers
ActionStateto other functions, I have deconstructed the objects with pattern-matching. This will go away more as we update more of the codebase to accept relevantActionStatevalues as inputs.loggerinTestEnvfor a while, but am not sure I have reached a satisfactory conclusion there. It probably makes sense for eachTestEnvobject to have its own logger, so that they are isolated from each other if multiple tests are run, but this makes it more awkward to inspect the results (since we have to acquire a reference to the logger of theTestEnvwe callpasseson). This could probably be improved, but may be outside the scope of this PR.Risk assessment
For internal use only. Please select the risk level of this change:
Which use cases does this change impact?
Workflow types:
dynamicworkflows (Default Setup, Code Quality, ...).Products:
analysis-kinds: code-scanning.analysis-kinds: code-quality.upload-sarifaction.Environments:
github.comand/or GitHub Enterprise Cloud with Data Residency.How did/will you validate this change?
.test.tsfiles).pr-checks).If something goes wrong after this change is released, what are the mitigation and rollback strategies?
How will you know if something goes wrong after this change is released?
Are there any special considerations for merging or releasing this change?
Merge / deployment checklist