You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit b707e94
Browse filesBrowse the repository at this point in the historyBrowse files
fix(features): keep JS property order in metadata, options and compose env
The reference CLI writes these objects in JS property order (array-index
keys ascending, then the others where each was first set); this CLI
sorted them:
- each entry's containerEnv in the devcontainer.metadata label, both a
base image's entries as its label lists them and the configuration's
as devcontainer.json declares it;
- a Feature's value in read-configuration's featuresConfiguration;
- the options of features resolve-dependencies' installOrder;
- the environment of the compose override, which is the merged
containerEnv, where a key keeps the position it first had
(Object.assign over the base image, Features and configuration).
An imagemeta.Entry now records its containerEnv's member order when it
is decoded or built from the configuration, keeps it through host
substitution, and MergeConfiguration carries the merged order. A
Feature's value and the resolve-dependencies options are written
through features.JSValue with the recorded option order.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: docs/parity/parity-matrix.yaml
+55Lines changed: 55 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -199,6 +199,19 @@ initial_cases:
199
199
notes: "readLockfile rethrows JSON.parse's SyntaxError and runAsyncHandler console.errors it: 'SyntaxError: Expected ',' or '}' after property value in JSON at position 15 (line 1 column 16)' on stderr, exit 1, nothing on stdout. Go used to ignore the lockfile and print the graph."
200
200
201
201
# --- Wave A: new cases (some uncovered divergences, now fixed) ---
notes: "installOrder's options are each Feature's value, the user's options object from devcontainer.json or the dependsOn options from devcontainer-feature.json, as JSON.parse built it: the array-index keys first, ascending, then the others as declared. Go sorted them."
214
+
202
215
- id: features-publish.missing-required
203
216
lane: contract
204
217
command: features-publish
@@ -1135,6 +1148,20 @@ initial_cases:
1135
1148
current_status: match
1136
1149
notes: "TS getDevcontainerMetadata writes the Feature's raw values to the devcontainer.metadata label (imageMetadata.ts uses .raw), so a Feature mount and lifecycle command keep ${localEnv:HOME} and are resolved on the host that runs `up`. Go resolved the Feature's mounts before building the label, baking the build host's HOME into the image."
notes: "TS getDevcontainerMetadata writes the base image's entries as JSON.parse read them from its label and the config's raw containerEnv as devcontainer.json declares it, so each containerEnv keeps JS property order (the array-index keys 2 and 10 first, ascending, then the others as declared). Go sorted each entry's containerEnv (10 before 2, AB before ZB, ALPHA before ZED)."
notes: "The compose service's image and container labels keep the Feature's ${localEnv:HOME} raw, as TS writes them; the bind mount the container gets is resolved on this host (TS getDevcontainerMetadata's featureRaw.map(substitute)). Go resolved the Feature's mounts before building the label."
notes: "TS writes the compose override's environment from the merged containerEnv (mergeConfiguration's Object.assign over the base image's label, the Features and the config): a key keeps the position it first had, the array-index keys 2 and 10 first, and the value of the last entry that sets it. The container and image labels keep each entry's containerEnv in JS property order. Go sorted the environment and each label entry's containerEnv."
notes: "A local Feature entry is devcontainer-feature.json as JSON.parse reads it, every property kept (keywords, x, empty, an empty option), a repeated one at its first position with its last value, the array-index properties 2 and 10 first, numbers as JS writes them (1.5), and the options' properties in the file's order; then name, value, included, cachePath and consecutiveId (processFeatureIdentifier, fetchFeatures). updateFromOldProperties (containerFeaturesConfiguration.ts) moves extensions and settings into customizations.vscode, settings spread under vscode's. Go used to write only the properties it has fields for, in the struct's order, with options sorted and the deprecated properties dropped."
notes: "A Feature's value is the user's options object from devcontainer.json as JSON.parse built it, so it keeps JS property order: the array-index keys 2 and 10 first, ascending, then zz and a as declared. Go sorted it (10, 2, a, zz)."
0 commit comments