diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 822b666..40e3022 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -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 diff --git a/CHANGELOG.md b/CHANGELOG.md index b6bb18d..7e2cc95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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)) diff --git a/Dockerfile b/Dockerfile index 145c38a..ace01cf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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" ] diff --git a/src/dockerValidator.ts b/src/dockerValidator.ts index 5ffb17d..25cc91b 100644 --- a/src/dockerValidator.ts +++ b/src/dockerValidator.ts @@ -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); @@ -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": @@ -1827,4 +1827,4 @@ export class Validator { source: "dockerfile-utils" }; } -} \ No newline at end of file +} diff --git a/test/dockerFormatter.test.ts b/test/dockerFormatter.test.ts index aa5cf37..3ce927a 100644 --- a/test/dockerFormatter.test.ts +++ b/test/dockerFormatter.test.ts @@ -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); } diff --git a/test/dockerValidator.test.ts b/test/dockerValidator.test.ts index 423c186..b1ba345 100644 --- a/test/dockerValidator.test.ts +++ b/test/dockerValidator.test.ts @@ -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); } @@ -1395,14 +1395,14 @@ describe("Docker Validator Tests", function() { }); it("ignore", function() { - let settings: any = {}; + let settings: Record = {}; settings[settingsName] = ValidationSeverity.IGNORE; let diagnostics = validateDockerfile(content, settings); assert.strictEqual(diagnostics.length, 0); }); it("warning", function() { - let settings: any = {}; + let settings: Record = {}; settings[settingsName] = ValidationSeverity.WARNING; let diagnostics = validateDockerfile(content, settings); assert.strictEqual(diagnostics.length, 1); @@ -1415,7 +1415,7 @@ describe("Docker Validator Tests", function() { }); it("error", function() { - let settings: any = {}; + let settings: Record = {}; settings[settingsName] = ValidationSeverity.ERROR; let diagnostics = validateDockerfile(content, settings); assert.strictEqual(diagnostics.length, 1); @@ -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);