Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
node-version: ${{ matrix.node-version }}
- name: Build
run: |
npm install
npm ci
npm run build
- name: Package
run: npm pack
Expand Down
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
# Changelog
All notable changes to this project will be documented in this file.

## [Unreleased]
### Added
- support parsing the new `--unpack` flag for ADD instructions ([#131](https://github.com/rcjsuen/dockerfile-utils/issues/131))

## [0.16.3] - 2025-07-21
### Fixed
- prevent tabbed delimiters in heredocs from crashing the linter and formatter ([#129](https://github.com/rcjsuen/dockerfile-utils/issues/129))
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@ COPY lib /dockerfile-utils/lib
COPY bin /dockerfile-utils/bin
COPY package.json /dockerfile-utils/package.json
WORKDIR /dockerfile-utils/
RUN npm install --ignore-scripts --production && \
RUN npm ci --ignore-scripts --omit=dev && \
chmod +x /dockerfile-utils/bin/dockerfile-utils
ENTRYPOINT [ "/dockerfile-utils/bin/dockerfile-utils" ]
6 changes: 3 additions & 3 deletions src/dockerValidator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -702,7 +702,7 @@ export class Validator {
const flagRange = flag.getRange();
if (name === "") {
problems.push(Validator.createUnknownAddFlag(addInstructionRange.start.line, flagRange.start, flagRange.end, name));
} else if (name === "link" || name === "keep-git-dir") {
} else if (name === "link" || name === "keep-git-dir" || name === "unpack") {
const problem = this.checkFlagBoolean(addInstructionRange.start.line, flag);
if (problem !== null) {
problems.push(problem);
Expand All @@ -717,7 +717,7 @@ export class Validator {
problems.push(addDestinationDiagnostic);
}
this.checkFlagValue(addInstructionRange.start.line, addFlags, ["chmod", "chown", "checksum", "exclude"], problems);
this.checkDuplicateFlags(addInstructionRange.start.line, addFlags, ["chmod", "chown", "checksum", "keep-git-dir", "link"], problems);
this.checkDuplicateFlags(addInstructionRange.start.line, addFlags, ["chmod", "chown", "checksum", "keep-git-dir", "link", "unpack"], problems);
this.checkJSONQuotes(instruction, problems);
break;
case "COPY":
Expand Down Expand Up @@ -1827,4 +1827,4 @@ export class Validator {
source: "dockerfile-utils"
};
}
}
}
2 changes: 1 addition & 1 deletion test/dockerFormatter.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { TextEdit, Position, Range } from 'vscode-languageserver-types';
import { format, formatRange as apiFormatRange, formatOnType as apiFormatOnType, FormatterSettings } from '../src/main';
import { Keyword } from "dockerfile-ast";

function createDocument(content: string): any {
function createDocument(content: string): TextDocument {
return TextDocument.create("uri://host/Dockerfile.sample", "dockerfile", 1, content);
}

Expand Down
33 changes: 29 additions & 4 deletions test/dockerValidator.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { ValidationCode, ValidatorSettings, ValidationSeverity, validate } from

let source = "dockerfile-utils";

function createDocument(content: string): any {
function createDocument(content: string): TextDocument {
return TextDocument.create("uri://host/Dockerfile.sample", "dockerfile", 1, content);
}

Expand Down Expand Up @@ -1395,14 +1395,14 @@ describe("Docker Validator Tests", function() {
});

it("ignore", function() {
let settings: any = {};
let settings: Record<string, unknown> = {};
settings[settingsName] = ValidationSeverity.IGNORE;
let diagnostics = validateDockerfile(content, settings);
assert.strictEqual(diagnostics.length, 0);
});

it("warning", function() {
let settings: any = {};
let settings: Record<string, unknown> = {};
settings[settingsName] = ValidationSeverity.WARNING;
let diagnostics = validateDockerfile(content, settings);
assert.strictEqual(diagnostics.length, 1);
Expand All @@ -1415,7 +1415,7 @@ describe("Docker Validator Tests", function() {
});

it("error", function() {
let settings: any = {};
let settings: Record<string, unknown> = {};
settings[settingsName] = ValidationSeverity.ERROR;
let diagnostics = validateDockerfile(content, settings);
assert.strictEqual(diagnostics.length, 1);
Expand Down Expand Up @@ -2364,6 +2364,31 @@ describe("Docker Validator Tests", function() {
});
});

describe("unpack", () => {
it("ok", () => {
const diagnostics = validateDockerfile("FROM alpine\nADD --unpack=true https://github.com/moby/buildkit.git#v0.10.1 /buildkit");
assert.strictEqual(diagnostics.length, 0);
});

it("flag no value", () => {
const diagnostics = validateDockerfile("FROM alpine\nADD --unpack https://github.com/moby/buildkit.git#v0.10.1 /buildkit");
assert.strictEqual(diagnostics.length, 0, "--unpack defaults to false if no value specified");
});

it("invalid value", function() {
const diagnostics = validateDockerfile("FROM alpine\nADD --unpack=abc https://github.com/moby/buildkit.git#v0.10.1 /buildkit");
assert.strictEqual(diagnostics.length, 1);
assertFlagExpectedBooleanValue(diagnostics[0], 1, "unpack", "abc", 1, 13, 1, 16);
});

it("duplicate flag", () => {
const diagnostics = validateDockerfile("FROM alpine\nADD --unpack=true --unpack=false https://github.com/moby/buildkit.git#v0.10.1 /buildkit");
assert.strictEqual(diagnostics.length, 2);
assertFlagDuplicate(diagnostics[0], 1, "unpack", 1, 6, 1, 12);
assertFlagDuplicate(diagnostics[1], 1, "unpack", 1, 20, 1, 26);
});
});

it("unknown flag", function() {
let diagnostics = validateDockerfile("FROM alpine\nADD --x=bb . .");
assert.equal(diagnostics.length, 1);
Expand Down