From 9b1ffe921c5289ae8afe873fd9e76bcbfb1f2d2c Mon Sep 17 00:00:00 2001 From: Connor Sullivan Date: Sat, 3 Aug 2024 12:46:38 -0400 Subject: [PATCH 01/10] =?UTF-8?q?=E2=9C=A8=20Output=20directory=20option?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds output directory option (`-o` or `--outdir`) as alternative to generating the declaration files alongside the source file. --- .github/workflows/pipeline.yaml | 3 +++ src/logic.test.ts | 9 +++++---- src/logic.ts | 15 ++++++++++++--- src/main.ts | 17 +++++++++++++---- 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/.github/workflows/pipeline.yaml b/.github/workflows/pipeline.yaml index 396dbad..fd128dc 100644 --- a/.github/workflows/pipeline.yaml +++ b/.github/workflows/pipeline.yaml @@ -93,6 +93,9 @@ jobs: node dist/main.js --localsConvention camelCaseOnly "$RUNNER_TEMP/*.css" diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/camelCaseOnly.d.css.ts "$RUNNER_TEMP/casing.d.css.ts" + node dist/main.js "$RUNNER_TEMP/*.css" -o "$RUNNER_TEMP/generated" + diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/dashesOnly.d.css.ts "$RUNNER_TEMP/generated/casing.d.css.ts" + Publish: if: ${{ github.ref == 'refs/heads/main' }} name: Publish diff --git a/src/logic.test.ts b/src/logic.test.ts index e7d008b..d6412f3 100644 --- a/src/logic.test.ts +++ b/src/logic.test.ts @@ -39,10 +39,11 @@ describe(`css-typed`, () => { describe(`dtsPath`, () => { it.each([ - [`foo.css`, `foo.d.css.ts`], - [`foo.module.css`, `foo.module.d.css.ts`], - ])(`%s should create file %s`, (input, expected) => { - expect(dtsPath(input)).toStrictEqual(expected); + [`foo.css`, undefined, `foo.d.css.ts`], + [`foo.module.css`, undefined, `foo.module.d.css.ts`], + [`src/bar/foo.css`, `generated`, `generated/src/bar/foo.d.css.ts`], + ])(`%s should create file %s`, (input, outdir, expected) => { + expect(dtsPath(input, outdir)).toStrictEqual(expected); }); }); }); diff --git a/src/logic.ts b/src/logic.ts index 390dc19..7eb6bea 100644 --- a/src/logic.ts +++ b/src/logic.ts @@ -154,7 +154,16 @@ function dashesCamelCase(s: string) { ); } -export function dtsPath(stylesheetPath: string) { - const { dir, name, ext } = path.parse(stylesheetPath); - return path.join(dir, `${name}.d${ext}.ts`); +export function dtsPath(stylesheetPath: string, outdir: string | undefined) { + const { dir: originalDirectory, name, ext } = path.parse(stylesheetPath); + + let directory; + if (outdir) { + const relative = path.relative(process.cwd(), originalDirectory); + directory = path.join(outdir, relative); + } else { + directory = originalDirectory; + } + + return path.join(directory, `${name}.d${ext}.ts`); } diff --git a/src/main.ts b/src/main.ts index c072290..2dd33c9 100755 --- a/src/main.ts +++ b/src/main.ts @@ -22,6 +22,10 @@ await new Command() .choices(localsConventionChoices) .default(`dashesOnly` as const), ) + .option( + `-o, --outdir `, + `Root directory for generated CSS declaration files.`, + ) .action(async function (pattern, options) { const files = await glob(pattern); @@ -29,7 +33,7 @@ await new Command() await Promise.all( files.map((file) => generateDeclaration(file, time, options).then((ts) => - writeDeclarationFile(file, ts), + writeDeclarationFile(file, options.outdir, ts), ), ), ); @@ -39,12 +43,17 @@ await new Command() /** * Writes the TypeScript declaration content to file. Handles the output path. * - * @param path - Path to the original stylesheet file. NOT the path to write. + * @param file - Path to the original stylesheet file. NOT the path to write. + * @param outdir - Output directory to which to write. * @param ts - The TypeScript declaration content to write. * @returns Empty promise indicating when writing has completed. */ -async function writeDeclarationFile(path: string, ts: string | undefined) { +async function writeDeclarationFile( + file: string, + outdir: string | undefined, + ts: string | undefined, +) { if (!ts) return undefined; - await writeFile(dtsPath(path), ts, `utf8`); + await writeFile(dtsPath(file, outdir), ts, `utf8`); return undefined; } From 7da3c3bb323065028c135ad1ed8045ad315cc4d5 Mon Sep 17 00:00:00 2001 From: Connor Sullivan Date: Sat, 3 Aug 2024 12:49:59 -0400 Subject: [PATCH 02/10] Fix pipeline test --- .github/workflows/pipeline.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pipeline.yaml b/.github/workflows/pipeline.yaml index fd128dc..9078fb3 100644 --- a/.github/workflows/pipeline.yaml +++ b/.github/workflows/pipeline.yaml @@ -93,7 +93,7 @@ jobs: node dist/main.js --localsConvention camelCaseOnly "$RUNNER_TEMP/*.css" diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/camelCaseOnly.d.css.ts "$RUNNER_TEMP/casing.d.css.ts" - node dist/main.js "$RUNNER_TEMP/*.css" -o "$RUNNER_TEMP/generated" + node dist/main.js "$RUNNER_TEMP/*.css" -o generated diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/dashesOnly.d.css.ts "$RUNNER_TEMP/generated/casing.d.css.ts" Publish: From 58bed42306d644264560d9d26a801f5e69fd7ae8 Mon Sep 17 00:00:00 2001 From: Connor Sullivan Date: Sat, 3 Aug 2024 13:06:18 -0400 Subject: [PATCH 03/10] Fix some logic to ensure absolute paths --- .github/workflows/pipeline.yaml | 13 ++++++++----- src/logic.test.ts | 20 ++++++++++++++------ src/logic.ts | 2 +- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/.github/workflows/pipeline.yaml b/.github/workflows/pipeline.yaml index 9078fb3..04e062d 100644 --- a/.github/workflows/pipeline.yaml +++ b/.github/workflows/pipeline.yaml @@ -84,17 +84,20 @@ jobs: run: | cp src/fixtures/casing/casing.css "$RUNNER_TEMP/casing.css" - node dist/main.js "$RUNNER_TEMP/*.css" + ./dist/main.js "$RUNNER_TEMP/*.css" diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/dashesOnly.d.css.ts "$RUNNER_TEMP/casing.d.css.ts" - node dist/main.js "$RUNNER_TEMP/*.css" --localsConvention camelCaseOnly + ./dist/main.js "$RUNNER_TEMP/*.css" --localsConvention camelCaseOnly diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/camelCaseOnly.d.css.ts "$RUNNER_TEMP/casing.d.css.ts" - node dist/main.js --localsConvention camelCaseOnly "$RUNNER_TEMP/*.css" + ./dist/main.js --localsConvention camelCaseOnly "$RUNNER_TEMP/*.css" diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/camelCaseOnly.d.css.ts "$RUNNER_TEMP/casing.d.css.ts" - node dist/main.js "$RUNNER_TEMP/*.css" -o generated - diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/dashesOnly.d.css.ts "$RUNNER_TEMP/generated/casing.d.css.ts" + ./dist/main.js "$RUNNER_TEMP/*.css" --outdir gen1 + diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/dashesOnly.d.css.ts "$RUNNER_TEMP/gen1/casing.d.css.ts" + + ./dist/main.js "$RUNNER_TEMP/*.css" -o $RUNNER_TEMP/gen2 + diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/dashesOnly.d.css.ts "$RUNNER_TEMP/gen2/casing.d.css.ts" Publish: if: ${{ github.ref == 'refs/heads/main' }} diff --git a/src/logic.test.ts b/src/logic.test.ts index d6412f3..ff4ebb7 100644 --- a/src/logic.test.ts +++ b/src/logic.test.ts @@ -1,5 +1,6 @@ import { readFileSync } from "node:fs"; import path from "node:path"; +import * as process from "node:process"; import { describe, expect, it } from "vitest"; @@ -37,14 +38,21 @@ describe(`css-typed`, () => { }); }); + const cwd = process.cwd(); + const cwdParent = path.resolve(cwd, `..`); describe(`dtsPath`, () => { it.each([ - [`foo.css`, undefined, `foo.d.css.ts`], - [`foo.module.css`, undefined, `foo.module.d.css.ts`], - [`src/bar/foo.css`, `generated`, `generated/src/bar/foo.d.css.ts`], - ])(`%s should create file %s`, (input, outdir, expected) => { - expect(dtsPath(input, outdir)).toStrictEqual(expected); - }); + [`src/foo.css`, `${cwd}/src/foo.d.css.ts`, undefined], + [`src/foo.module.css`, `${cwd}/src/foo.module.d.css.ts`, ``], + [`src/foo.css`, `${cwd}/generated/src/foo.d.css.ts`, `generated`], + [`src/foo.css`, `/absolute/src/foo.d.css.ts`, `/absolute`], + [`src/foo.css`, `${cwdParent}/relative/src/foo.d.css.ts`, `../relative`], + ])( + `[%s] should create file [%s] with outdir [%s]`, + (input, expected, outdir) => { + expect(dtsPath(input, outdir)).toStrictEqual(expected); + }, + ); }); }); diff --git a/src/logic.ts b/src/logic.ts index 7eb6bea..d88078b 100644 --- a/src/logic.ts +++ b/src/logic.ts @@ -165,5 +165,5 @@ export function dtsPath(stylesheetPath: string, outdir: string | undefined) { directory = originalDirectory; } - return path.join(directory, `${name}.d${ext}.ts`); + return path.join(path.resolve(directory), `${name}.d${ext}.ts`); } From 1d9669aa3fb65b6ed675f589c19e14d4d9575a7a Mon Sep 17 00:00:00 2001 From: Connor Sullivan Date: Sat, 3 Aug 2024 13:08:09 -0400 Subject: [PATCH 04/10] Fix test logic --- .github/workflows/pipeline.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pipeline.yaml b/.github/workflows/pipeline.yaml index 04e062d..ddd1256 100644 --- a/.github/workflows/pipeline.yaml +++ b/.github/workflows/pipeline.yaml @@ -94,7 +94,7 @@ jobs: diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/camelCaseOnly.d.css.ts "$RUNNER_TEMP/casing.d.css.ts" ./dist/main.js "$RUNNER_TEMP/*.css" --outdir gen1 - diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/dashesOnly.d.css.ts "$RUNNER_TEMP/gen1/casing.d.css.ts" + diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/dashesOnly.d.css.ts "gen1/casing.d.css.ts" ./dist/main.js "$RUNNER_TEMP/*.css" -o $RUNNER_TEMP/gen2 diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/dashesOnly.d.css.ts "$RUNNER_TEMP/gen2/casing.d.css.ts" From 99e622c753353ad49166133a1fd58d95006c2cd4 Mon Sep 17 00:00:00 2001 From: Connor Sullivan Date: Sat, 3 Aug 2024 13:08:46 -0400 Subject: [PATCH 05/10] nit: use generated name --- .github/workflows/pipeline.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pipeline.yaml b/.github/workflows/pipeline.yaml index ddd1256..4124f13 100644 --- a/.github/workflows/pipeline.yaml +++ b/.github/workflows/pipeline.yaml @@ -93,11 +93,11 @@ jobs: ./dist/main.js --localsConvention camelCaseOnly "$RUNNER_TEMP/*.css" diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/camelCaseOnly.d.css.ts "$RUNNER_TEMP/casing.d.css.ts" - ./dist/main.js "$RUNNER_TEMP/*.css" --outdir gen1 - diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/dashesOnly.d.css.ts "gen1/casing.d.css.ts" + ./dist/main.js "$RUNNER_TEMP/*.css" --outdir generated + diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/dashesOnly.d.css.ts "generated/casing.d.css.ts" - ./dist/main.js "$RUNNER_TEMP/*.css" -o $RUNNER_TEMP/gen2 - diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/dashesOnly.d.css.ts "$RUNNER_TEMP/gen2/casing.d.css.ts" + ./dist/main.js "$RUNNER_TEMP/*.css" -o $RUNNER_TEMP/generated + diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/dashesOnly.d.css.ts "$RUNNER_TEMP/generated/casing.d.css.ts" Publish: if: ${{ github.ref == 'refs/heads/main' }} From 8a62ed2d05207c6dc0c6404e09718654ec3b0889 Mon Sep 17 00:00:00 2001 From: Connor Sullivan Date: Sat, 3 Aug 2024 13:15:19 -0400 Subject: [PATCH 06/10] Change test directory --- .github/workflows/pipeline.yaml | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/.github/workflows/pipeline.yaml b/.github/workflows/pipeline.yaml index 4124f13..8a9ab55 100644 --- a/.github/workflows/pipeline.yaml +++ b/.github/workflows/pipeline.yaml @@ -82,22 +82,23 @@ jobs: # Use `-I '//.*'` to ignore the first line (comment) which has generated path and timestamp # Test `--localsConvention` in both positions run: | - cp src/fixtures/casing/casing.css "$RUNNER_TEMP/casing.css" + cp $GITHUB_WORKSPACE/src/fixtures/casing/casing.css casing.css - ./dist/main.js "$RUNNER_TEMP/*.css" - diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/dashesOnly.d.css.ts "$RUNNER_TEMP/casing.d.css.ts" + ./dist/main.js "*.css" + diff --strip-trailing-cr -uI '//.*' $GITHUB_WORKSPACE/src/fixtures/casing/dashesOnly.d.css.ts casing.d.css.ts - ./dist/main.js "$RUNNER_TEMP/*.css" --localsConvention camelCaseOnly - diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/camelCaseOnly.d.css.ts "$RUNNER_TEMP/casing.d.css.ts" + ./dist/main.js "*.css" --localsConvention camelCaseOnly + diff --strip-trailing-cr -uI '//.*' $GITHUB_WORKSPACE/src/fixtures/casing/camelCaseOnly.d.css.ts casing.d.css.ts - ./dist/main.js --localsConvention camelCaseOnly "$RUNNER_TEMP/*.css" - diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/camelCaseOnly.d.css.ts "$RUNNER_TEMP/casing.d.css.ts" + ./dist/main.js --localsConvention camelCaseOnly "*.css" + diff --strip-trailing-cr -uI '//.*' $GITHUB_WORKSPACE/src/fixtures/casing/camelCaseOnly.d.css.ts casing.d.css.ts - ./dist/main.js "$RUNNER_TEMP/*.css" --outdir generated - diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/dashesOnly.d.css.ts "generated/casing.d.css.ts" + ./dist/main.js "*.css" --outdir generated + diff --strip-trailing-cr -uI '//.*' $GITHUB_WORKSPACE/src/fixtures/casing/dashesOnly.d.css.ts generated/casing.d.css.ts - ./dist/main.js "$RUNNER_TEMP/*.css" -o $RUNNER_TEMP/generated - diff --strip-trailing-cr -uI '//.*' src/fixtures/casing/dashesOnly.d.css.ts "$RUNNER_TEMP/generated/casing.d.css.ts" + ./dist/main.js "*.css" -o $GITHUB_WORKSPACE/generated + diff --strip-trailing-cr -uI '//.*' $GITHUB_WORKSPACE/src/fixtures/casing/dashesOnly.d.css.ts $GITHUB_WORKSPACE/generated/casing.d.css.ts + working-directory: $RUNNER_TEMP Publish: if: ${{ github.ref == 'refs/heads/main' }} From 1e7d47fa8bdbb7411af1cab191afabe72a9768ea Mon Sep 17 00:00:00 2001 From: Connor Sullivan Date: Sat, 3 Aug 2024 13:18:51 -0400 Subject: [PATCH 07/10] runner tmp cannot be working dir --- .github/workflows/pipeline.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pipeline.yaml b/.github/workflows/pipeline.yaml index 8a9ab55..0ea0a83 100644 --- a/.github/workflows/pipeline.yaml +++ b/.github/workflows/pipeline.yaml @@ -82,6 +82,7 @@ jobs: # Use `-I '//.*'` to ignore the first line (comment) which has generated path and timestamp # Test `--localsConvention` in both positions run: | + cd $RUNNER_TEMP cp $GITHUB_WORKSPACE/src/fixtures/casing/casing.css casing.css ./dist/main.js "*.css" @@ -98,7 +99,6 @@ jobs: ./dist/main.js "*.css" -o $GITHUB_WORKSPACE/generated diff --strip-trailing-cr -uI '//.*' $GITHUB_WORKSPACE/src/fixtures/casing/dashesOnly.d.css.ts $GITHUB_WORKSPACE/generated/casing.d.css.ts - working-directory: $RUNNER_TEMP Publish: if: ${{ github.ref == 'refs/heads/main' }} From 92361b1eff77836ea9323b4bc2b9dd4202722f1c Mon Sep 17 00:00:00 2001 From: Connor Sullivan Date: Sat, 3 Aug 2024 13:20:38 -0400 Subject: [PATCH 08/10] fix executable in tests --- .github/workflows/pipeline.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/pipeline.yaml b/.github/workflows/pipeline.yaml index 0ea0a83..6d53491 100644 --- a/.github/workflows/pipeline.yaml +++ b/.github/workflows/pipeline.yaml @@ -85,19 +85,19 @@ jobs: cd $RUNNER_TEMP cp $GITHUB_WORKSPACE/src/fixtures/casing/casing.css casing.css - ./dist/main.js "*.css" + $GITHUB_WORKSPACE/dist/main.js "*.css" diff --strip-trailing-cr -uI '//.*' $GITHUB_WORKSPACE/src/fixtures/casing/dashesOnly.d.css.ts casing.d.css.ts - ./dist/main.js "*.css" --localsConvention camelCaseOnly + $GITHUB_WORKSPACE/dist/main.js "*.css" --localsConvention camelCaseOnly diff --strip-trailing-cr -uI '//.*' $GITHUB_WORKSPACE/src/fixtures/casing/camelCaseOnly.d.css.ts casing.d.css.ts - ./dist/main.js --localsConvention camelCaseOnly "*.css" + $GITHUB_WORKSPACE/dist/main.js --localsConvention camelCaseOnly "*.css" diff --strip-trailing-cr -uI '//.*' $GITHUB_WORKSPACE/src/fixtures/casing/camelCaseOnly.d.css.ts casing.d.css.ts - ./dist/main.js "*.css" --outdir generated + $GITHUB_WORKSPACE/dist/main.js "*.css" --outdir generated diff --strip-trailing-cr -uI '//.*' $GITHUB_WORKSPACE/src/fixtures/casing/dashesOnly.d.css.ts generated/casing.d.css.ts - ./dist/main.js "*.css" -o $GITHUB_WORKSPACE/generated + $GITHUB_WORKSPACE/dist/main.js "*.css" -o $GITHUB_WORKSPACE/generated diff --strip-trailing-cr -uI '//.*' $GITHUB_WORKSPACE/src/fixtures/casing/dashesOnly.d.css.ts $GITHUB_WORKSPACE/generated/casing.d.css.ts Publish: From 6967b5bd20ac20d7215cff763f12755c94254252 Mon Sep 17 00:00:00 2001 From: Connor Sullivan Date: Sat, 3 Aug 2024 13:32:13 -0400 Subject: [PATCH 09/10] Rework tests --- .github/workflows/pipeline.yaml | 60 ++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/.github/workflows/pipeline.yaml b/.github/workflows/pipeline.yaml index 6d53491..62c49f2 100644 --- a/.github/workflows/pipeline.yaml +++ b/.github/workflows/pipeline.yaml @@ -77,28 +77,58 @@ jobs: - name: Build run: npm run build - - name: Run css-typed (the test) - # `node dist/main.js` is executing local `css-typed` as if installed (same as `bin`) - # Use `-I '//.*'` to ignore the first line (comment) which has generated path and timestamp - # Test `--localsConvention` in both positions + # Run tests + # + # - Run from $RUNNER_TEMP for auto-cleanup. + # - `./dist/main.js` is executing local `css-typed` as if installed (same as `bin`). + # But it is `$GITHUB_WORKSPACE/dist/main.js` b/c we `cd $RUNNER_TEMP`. + # - Use `diff` to compare the files. + # Use `-I '//.*'` to ignore the first line (comment) which has generated path and timestamp. + + - name: "Test 1: Default case" run: | + cp src/fixtures/casing/casing.css $RUNNER_TEMP/casing.css + cp src/fixtures/casing/dashesOnly.d.css.ts $RUNNER_TEMP/expected.d.css.ts + + cd $RUNNER_TEMP + $GITHUB_WORKSPACE/dist/main.js '*.css' + diff --strip-trailing-cr -uI '//.*' expected.d.css.ts casing.d.css.ts + + - name: "Test 2: localsConvention, second position" + run: | + cp src/fixtures/casing/casing.css $RUNNER_TEMP/casing.css + cp src/fixtures/casing/camelCaseOnly.d.css.ts $RUNNER_TEMP/expected.d.css.ts + cd $RUNNER_TEMP - cp $GITHUB_WORKSPACE/src/fixtures/casing/casing.css casing.css + $GITHUB_WORKSPACE/dist/main.js '*.css' --localsConvention camelCaseOnly + diff --strip-trailing-cr -uI '//.*' expected.d.css.ts casing.d.css.ts + + - name: "Test 3: localsConvention, first position" + run: | + cp src/fixtures/casing/casing.css $RUNNER_TEMP/casing.css + cp src/fixtures/casing/camelCaseOnly.d.css.ts $RUNNER_TEMP/expected.d.css.ts - $GITHUB_WORKSPACE/dist/main.js "*.css" - diff --strip-trailing-cr -uI '//.*' $GITHUB_WORKSPACE/src/fixtures/casing/dashesOnly.d.css.ts casing.d.css.ts + cd $RUNNER_TEMP + $GITHUB_WORKSPACE/dist/main.js --localsConvention camelCaseOnly '*.css' + diff --strip-trailing-cr -uI '//.*' expected.d.css.ts casing.d.css.ts - $GITHUB_WORKSPACE/dist/main.js "*.css" --localsConvention camelCaseOnly - diff --strip-trailing-cr -uI '//.*' $GITHUB_WORKSPACE/src/fixtures/casing/camelCaseOnly.d.css.ts casing.d.css.ts + - name: "Test 4: relative outdir" + run: | + cp src/fixtures/casing/casing.css $RUNNER_TEMP/casing.css + cp src/fixtures/casing/dashesOnly.d.css.ts $RUNNER_TEMP/expected.d.css.ts - $GITHUB_WORKSPACE/dist/main.js --localsConvention camelCaseOnly "*.css" - diff --strip-trailing-cr -uI '//.*' $GITHUB_WORKSPACE/src/fixtures/casing/camelCaseOnly.d.css.ts casing.d.css.ts + cd $RUNNER_TEMP + $GITHUB_WORKSPACE/dist/main.js '*.css' --outdir generated + diff --strip-trailing-cr -uI '//.*' expected.d.css.ts generated/casing.d.css.ts - $GITHUB_WORKSPACE/dist/main.js "*.css" --outdir generated - diff --strip-trailing-cr -uI '//.*' $GITHUB_WORKSPACE/src/fixtures/casing/dashesOnly.d.css.ts generated/casing.d.css.ts + - name: "Test 5: absolute outdir" + run: | + cp src/fixtures/casing/casing.css $RUNNER_TEMP/casing.css + cp src/fixtures/casing/dashesOnly.d.css.ts $RUNNER_TEMP/expected.d.css.ts - $GITHUB_WORKSPACE/dist/main.js "*.css" -o $GITHUB_WORKSPACE/generated - diff --strip-trailing-cr -uI '//.*' $GITHUB_WORKSPACE/src/fixtures/casing/dashesOnly.d.css.ts $GITHUB_WORKSPACE/generated/casing.d.css.ts + cd $RUNNER_TEMP + $GITHUB_WORKSPACE/dist/main.js '*.css' -o $GITHUB_WORKSPACE/generated + diff --strip-trailing-cr -uI '//.*' expected.d.css.ts $GITHUB_WORKSPACE/generated/casing.d.css.ts Publish: if: ${{ github.ref == 'refs/heads/main' }} From 6021160573d548a278dd29d08cfc785be0c37697 Mon Sep 17 00:00:00 2001 From: Connor Sullivan Date: Sat, 3 Aug 2024 13:40:50 -0400 Subject: [PATCH 10/10] Create directory if needed --- src/logic.test.ts | 2 +- src/logic.ts | 7 +++++-- src/main.ts | 18 ++++++++++++++---- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/logic.test.ts b/src/logic.test.ts index ff4ebb7..9737a02 100644 --- a/src/logic.test.ts +++ b/src/logic.test.ts @@ -50,7 +50,7 @@ describe(`css-typed`, () => { ])( `[%s] should create file [%s] with outdir [%s]`, (input, expected, outdir) => { - expect(dtsPath(input, outdir)).toStrictEqual(expected); + expect(path.join(...dtsPath(input, outdir))).toStrictEqual(expected); }, ); }); diff --git a/src/logic.ts b/src/logic.ts index d88078b..8ae360e 100644 --- a/src/logic.ts +++ b/src/logic.ts @@ -154,7 +154,10 @@ function dashesCamelCase(s: string) { ); } -export function dtsPath(stylesheetPath: string, outdir: string | undefined) { +export function dtsPath( + stylesheetPath: string, + outdir: string | undefined, +): [string, string] { const { dir: originalDirectory, name, ext } = path.parse(stylesheetPath); let directory; @@ -165,5 +168,5 @@ export function dtsPath(stylesheetPath: string, outdir: string | undefined) { directory = originalDirectory; } - return path.join(path.resolve(directory), `${name}.d${ext}.ts`); + return [path.resolve(directory), `${name}.d${ext}.ts`]; } diff --git a/src/main.ts b/src/main.ts index c141632..1aff532 100755 --- a/src/main.ts +++ b/src/main.ts @@ -1,6 +1,8 @@ #!/usr/bin/env node -import { writeFile } from "node:fs/promises"; +import { existsSync } from "node:fs"; +import { mkdir, writeFile } from "node:fs/promises"; +import path from "node:path"; import { Command, Option } from "@commander-js/extra-typings"; import { glob } from "glob"; @@ -55,7 +57,15 @@ async function writeDeclarationFile( outdir: string | undefined, ts: string | undefined, ) { - if (!ts) return undefined; - await writeFile(dtsPath(file, outdir), ts, `utf8`); - return undefined; + if (!ts) { + return undefined; + } + + const [directoryToWrite, fileToWrite] = dtsPath(file, outdir); + if (!existsSync(directoryToWrite)) { + await mkdir(directoryToWrite, { recursive: true }); + } + + const pathToWrite = path.join(directoryToWrite, fileToWrite); + await writeFile(pathToWrite, ts, { encoding: `utf8` }); }