From c60267dabf62743d2d40a3083dc0ee5f798788b9 Mon Sep 17 00:00:00 2001
From: Tim Covarrubias
Date: Mon, 22 Jun 2026 18:41:34 -0700
Subject: [PATCH 1/4] feat: add multi-arch Docker build (amd64 + arm64)
Add QEMU setup and platforms field to the docker-publish job so the
image is built for both linux/amd64 and linux/arm64. This enables
native execution on Apple Silicon Macs without Rosetta emulation.
Co-Authored-By: Claude Opus 4.6
---
.github/workflows/docker-image.yml | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml
index aa5235b..ed32a55 100644
--- a/.github/workflows/docker-image.yml
+++ b/.github/workflows/docker-image.yml
@@ -202,6 +202,9 @@ jobs:
echo "major=$MAJOR" >> "$GITHUB_OUTPUT"
echo "minor=$MINOR" >> "$GITHUB_OUTPUT"
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v3
+
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
@@ -234,6 +237,7 @@ jobs:
context: .
file: ./Dockerfile
push: true
+ platforms: linux/amd64,linux/arm64
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
From fd9bdf3aaf1f752537646d00ece0c19137f2f446 Mon Sep 17 00:00:00 2001
From: Tim Covarrubias
Date: Mon, 22 Jun 2026 18:44:25 -0700
Subject: [PATCH 2/4] style: fix prettier formatting
Co-Authored-By: Claude Opus 4.6
---
ui/package.json | 2 +-
ui/scripts/setup-api-client.js | 10 ++-
.../new-flags-file-form.html | 10 +--
ui/src/app/components/welcome/welcome.ts | 1 -
ui/src/app/models/generated/flagd-schema.ts | 80 ++++++++++---------
ui/src/environments.ts | 2 +-
ui/tsconfig.spec.json | 15 +---
7 files changed, 57 insertions(+), 63 deletions(-)
diff --git a/ui/package.json b/ui/package.json
index 7ed2c7e..3ee0be5 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -70,4 +70,4 @@
"typescript-eslint": "8.50.1",
"vitest": "^4.0.8"
}
-}
\ No newline at end of file
+}
diff --git a/ui/scripts/setup-api-client.js b/ui/scripts/setup-api-client.js
index a0fad5a..d42cdcc 100644
--- a/ui/scripts/setup-api-client.js
+++ b/ui/scripts/setup-api-client.js
@@ -27,8 +27,12 @@ if (fs.existsSync(sourceFile)) {
// Check if openapi.json exists
const openapiPath = path.join(uiRoot, 'openapi.json');
if (!fs.existsSync(openapiPath)) {
- console.warn(`⚠ Warning: openapi.json not found. This is expected if the Rust backend hasn't been built yet.`);
- console.warn(`⚠ Run 'cargo build' in the root directory to generate the OpenAPI spec, then run 'npm install' again in the ui directory.`);
+ console.warn(
+ `⚠ Warning: openapi.json not found. This is expected if the Rust backend hasn't been built yet.`,
+ );
+ console.warn(
+ `⚠ Run 'cargo build' in the root directory to generate the OpenAPI spec, then run 'npm install' again in the ui directory.`,
+ );
process.exit(0);
}
@@ -41,7 +45,7 @@ const dockerCmd = `docker run --rm -v "${cwd}:/local" openapitools/openapi-gener
const result = spawnSync(dockerCmd, {
shell: true,
- stdio: 'inherit'
+ stdio: 'inherit',
});
process.exit(result.status);
diff --git a/ui/src/app/components/new-flags-file-form/new-flags-file-form.html b/ui/src/app/components/new-flags-file-form/new-flags-file-form.html
index 534dfb0..3a2bcc4 100644
--- a/ui/src/app/components/new-flags-file-form/new-flags-file-form.html
+++ b/ui/src/app/components/new-flags-file-form/new-flags-file-form.html
@@ -18,11 +18,7 @@
File URL
-
+
Examples from flagd samples:
@@ -85,9 +81,7 @@
Discovering backend files…
{{ backendError }}
-
Discovered {{ discoveredFiles.length }} flag file(s):
+
Discovered {{ discoveredFiles.length }} flag file(s):
@for (f of discoveredFiles; track f) {
- {{ f }}
diff --git a/ui/src/app/components/welcome/welcome.ts b/ui/src/app/components/welcome/welcome.ts
index 94fe72e..1762885 100644
--- a/ui/src/app/components/welcome/welcome.ts
+++ b/ui/src/app/components/welcome/welcome.ts
@@ -16,4 +16,3 @@ export class WelcomeComponent {
// Form actions already navigate away via store/router
}
}
-
diff --git a/ui/src/app/models/generated/flagd-schema.ts b/ui/src/app/models/generated/flagd-schema.ts
index a89821f..113ee62 100644
--- a/ui/src/app/models/generated/flagd-schema.ts
+++ b/ui/src/app/models/generated/flagd-schema.ts
@@ -75,7 +75,7 @@ export type IfOperator = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )[]
+ )[],
];
/**
* A reference to another entity, used for $evaluators (shared rules).
@@ -126,7 +126,7 @@ export type LoseEqualityOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
];
/**
* Tests strict equality. Requires two arguments.
@@ -170,7 +170,7 @@ export type StrictEqualityOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
];
/**
* Tests not-equal, with type coercion.
@@ -214,7 +214,7 @@ export type LoseInequalityOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
];
/**
* Tests strict not-equal.
@@ -258,7 +258,7 @@ export type StrictInequalityOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
];
/**
* @minItems 2
@@ -300,7 +300,7 @@ export type GreaterThanOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
];
/**
* @minItems 2
@@ -342,7 +342,7 @@ export type GreaterThanOrEqualToOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
];
/**
* Finds the remainder after the first argument is divided by the second argument.
@@ -386,7 +386,7 @@ export type ModuloOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
];
/**
* @minItems 2
@@ -428,7 +428,7 @@ export type DivisionOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
];
/**
* Perform an action on every member of an array. Note, that inside the logic being used to map, var operations are relative to the array element being worked on.
@@ -472,7 +472,7 @@ export type MapOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
];
/**
* Keep only elements of the array that pass a test. Note, that inside the logic being used to filter, var operations are relative to the array element being worked on.
@@ -516,7 +516,7 @@ export type FilterOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
];
/**
* Perform a test on each member of that array, returning true if all pass. Inside the test code, var operations are relative to the array element being tested.
@@ -560,7 +560,7 @@ export type AllOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
];
/**
* Perform a test on each member of that array, returning true if none pass. Inside the test code, var operations are relative to the array element being tested.
@@ -604,7 +604,7 @@ export type NoneOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
];
/**
* Perform a test on each member of that array, returning true if some pass. Inside the test code, var operations are relative to the array element being tested.
@@ -648,7 +648,7 @@ export type SomeOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
];
/**
* If the second argument is an array, tests that the first argument is a member of the array.
@@ -692,7 +692,7 @@ export type InOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
];
/**
* Get a portion of a string. Give a positive start position to return everything beginning at that index. Give a negative start position to work backwards from the end of the string, then return everything. Give a positive length to express how many characters to return.
@@ -737,7 +737,7 @@ export type SubstringOperation =
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
]
| [
(
@@ -793,7 +793,7 @@ export type SubstringOperation =
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
];
/**
* @minItems 2
@@ -836,7 +836,7 @@ export type LessThanBetweenOperationCanBeUsedToTestThatOneValueIsBetweenTwoOther
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
]
| [
(
@@ -892,7 +892,7 @@ export type LessThanBetweenOperationCanBeUsedToTestThatOneValueIsBetweenTwoOther
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
];
/**
* @minItems 2
@@ -935,7 +935,7 @@ export type LessThanOrEqualToBetweenOperationCanBeUsedToTestThatOneValueIsBetwee
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
]
| [
(
@@ -991,7 +991,7 @@ export type LessThanOrEqualToBetweenOperationCanBeUsedToTestThatOneValueIsBetwee
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
];
/**
* Multiplication; associative, will accept and unlimited amount of arguments.
@@ -1052,7 +1052,7 @@ export type MultiplicationOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )[]
+ )[],
];
/**
* Logical negation (“not”). Takes just one argument.
@@ -1074,7 +1074,7 @@ export type NegationOperation =
| RuleSemVer
| FractionalRule
)
- | (null | boolean | number | string | unknown[])
+ | (null | boolean | number | string | unknown[]),
]
| (
| Reference
@@ -1114,7 +1114,7 @@ export type DoubleNegationOperation =
| RuleSemVer
| FractionalRule
)
- | (null | boolean | number | string | unknown[])
+ | (null | boolean | number | string | unknown[]),
]
| (
| Reference
@@ -1175,7 +1175,7 @@ export type OrOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )[]
+ )[],
];
/**
* Simple boolean test, with 1 or more arguments. At a more sophisticated level, "and" returns the first falsy argument, or the last argument.
@@ -1218,7 +1218,7 @@ export type VariadicOp = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )[]
+ )[],
];
/**
* Addition; associative, will accept and unlimited amount of arguments.
@@ -1261,7 +1261,7 @@ export type AdditionOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )[]
+ )[],
];
/**
* @minItems 1
@@ -1302,7 +1302,7 @@ export type SubtractionOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )[]
+ )[],
];
/**
* Return the maximum from a list of values.
@@ -1345,7 +1345,7 @@ export type MaximumOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )[]
+ )[],
];
/**
* Return the minimum from a list of values.
@@ -1388,7 +1388,7 @@ export type MinimumOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )[]
+ )[],
];
/**
* Takes one or more arrays, and merges them into one array. If arguments aren't arrays, they get cast to arrays.
@@ -1431,7 +1431,7 @@ export type MergeOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )[]
+ )[],
];
/**
* Concatenate all the supplied arguments. Note that this is not a join or implode operation, there is no “glue” string.
@@ -1474,7 +1474,7 @@ export type ConcatenateOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )[]
+ )[],
];
/**
* Combine all the elements in an array into a single value, like adding up a list of numbers. Note, that inside the logic being used to reduce, var operations only have access to an object with a "current" and a "accumulator".
@@ -1536,7 +1536,7 @@ export type ReduceOperation = [
| FractionalRule
)
| (null | boolean | number | string | unknown[])
- )
+ ),
];
/**
* The string attribute starts with the specified string value.
@@ -1578,7 +1578,7 @@ export type StartsWithOperation = [
| RuleSemVer
| FractionalRule
)
- )
+ ),
];
/**
* The string attribute ends with the specified string value.
@@ -1620,7 +1620,7 @@ export type EndsWithOperation = [
| RuleSemVer
| FractionalRule
)
- )
+ ),
];
/**
* Attribute matches a semantic version condition. Accepts "npm-style" range specifiers: "=", "!=", ">", "<", ">=", "<=", "~" (match minor version), "^" (match major version).
@@ -1631,7 +1631,7 @@ export type EndsWithOperation = [
export type SemanticVersionOperation = [
SemanticVersionString | VarOperation,
'=' | '!=' | '>' | '<' | '>=' | '<=' | '~' | '^',
- SemanticVersionString | VarOperation
+ SemanticVersionString | VarOperation,
];
/**
* A string representing a valid semantic version expression as per https://semver.org/.
@@ -1661,7 +1661,7 @@ export type FractionalOp = [
),
FractionalWeightArg,
FractionalWeightArg,
- ...FractionalWeightArg[]
+ ...FractionalWeightArg[],
];
/**
* Distribution for all possible variants, with their associated weighting.
@@ -1673,7 +1673,11 @@ export type FractionalWeightArg = [string] | [string, number];
/**
* @minItems 2
*/
-export type FractionalShorthandOp = [FractionalWeightArg, FractionalWeightArg, ...FractionalWeightArg[]];
+export type FractionalShorthandOp = [
+ FractionalWeightArg,
+ FractionalWeightArg,
+ ...FractionalWeightArg[],
+];
/**
* This interface was referenced by `Flags`'s JSON-Schema definition
* via the `patternProperty` "^.{1,}$".
diff --git a/ui/src/environments.ts b/ui/src/environments.ts
index ce1b75f..1a83327 100644
--- a/ui/src/environments.ts
+++ b/ui/src/environments.ts
@@ -1,5 +1,5 @@
/* This file is generated by scripts/generate-environments.js. */
export const GIT_TAG: string | null = null;
-export const GIT_COMMIT_HASH: string | null = "5c7cea5414ca606c1c7a2526ea9b9bbadfc33bc1";
+export const GIT_COMMIT_HASH: string | null = '5c7cea5414ca606c1c7a2526ea9b9bbadfc33bc1';
export const DEFAULT_BACKEND_ROOT: string | null = null;
diff --git a/ui/tsconfig.spec.json b/ui/tsconfig.spec.json
index da26f7d..4d73080 100644
--- a/ui/tsconfig.spec.json
+++ b/ui/tsconfig.spec.json
@@ -5,15 +5,8 @@
"compilerOptions": {
"outDir": "./out-tsc/spec",
"target": "es2022",
- "types": [
- "vitest/globals"
- ]
+ "types": ["vitest/globals"]
},
- "files": [
- "src/test-setup.ts"
- ],
- "include": [
- "src/**/*.spec.ts",
- "src/**/*.d.ts"
- ]
-}
\ No newline at end of file
+ "files": ["src/test-setup.ts"],
+ "include": ["src/**/*.spec.ts", "src/**/*.d.ts"]
+}
From 430396feedab3b41db4e0ad7ef2ea5dce9cce94d Mon Sep 17 00:00:00 2001
From: Tim Covarrubias
Date: Mon, 22 Jun 2026 18:47:53 -0700
Subject: [PATCH 3/4] chore: ignore generated schema types in prettier
The flagd-schema.ts file is auto-generated by json-schema-to-typescript
and should not be reformatted by prettier.
Co-Authored-By: Claude Opus 4.6
---
ui/.prettierignore | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/ui/.prettierignore b/ui/.prettierignore
index 00724dc..99dca0f 100644
--- a/ui/.prettierignore
+++ b/ui/.prettierignore
@@ -2,4 +2,5 @@ node_modules
dist
.angular
test-results
-src/app/api-client
\ No newline at end of file
+src/app/api-client
+src/app/models/generated
\ No newline at end of file
From ef9a3e0416d9875e34fdc5992fde4bf646864ab4 Mon Sep 17 00:00:00 2001
From: Tim Covarrubias
Date: Mon, 22 Jun 2026 18:52:00 -0700
Subject: [PATCH 4/4] fix: replace missing generated UpdateFlagRequest with
FlagFileContent
The OpenAPI generator no longer produces an UpdateFlagRequest model
since the backend uses a generic Object request body. Use the existing
FlagFileContent interface which has the same shape.
Co-Authored-By: Claude Opus 4.6
---
ui/src/app/state/flag-file-store.state.ts | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/ui/src/app/state/flag-file-store.state.ts b/ui/src/app/state/flag-file-store.state.ts
index 93eff94..70cd675 100644
--- a/ui/src/app/state/flag-file-store.state.ts
+++ b/ui/src/app/state/flag-file-store.state.ts
@@ -4,7 +4,6 @@ import { Action, createSelector, NgxsOnInit, Selector, State, StateContext } fro
import { firstValueFrom } from 'rxjs';
import { DEFAULT_BACKEND_ROOT } from '../../environments';
import { FlagsService } from '../api-client/api/flags.service';
-import { UpdateFlagRequest } from '../api-client/model/updateFlagRequest';
import { FlagFileContent } from '../models/flag.models';
import { FileSystemAccess } from '../services/file-system-access';
import {
@@ -371,7 +370,7 @@ export class FlagFileStore implements NgxsOnInit {
continue;
}
- const updatePayload: UpdateFlagRequest = {
+ const updatePayload: FlagFileContent = {
$evaluators: parsed.$evaluators ?? {},
flags: parsed.flags,
metadata: parsed.metadata ?? {},