Skip to content
Merged
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
9 changes: 9 additions & 0 deletions .config/appveyor/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ skip_non_tags: true
image: Ubuntu2004
environment:
NPM_TOKEN: NPM_TOKEN
REGISTRY: ghcr.io
IMAGE_NAME: devcontainer-config/setup
REGISTRY_TOKEN: REGISTRY_TOKEN
build_script:
- sh: >-
set -e
Expand All @@ -22,3 +25,9 @@ deploy_script:
devcontainer exec --workspace-folder . pnpm build

devcontainer exec --workspace-folder . --remote-env NPM_TOKEN=${NPM_TOKEN} pnpm run publish

devcontainer exec --workspace-folder . \
--remote-env REGISTRY=${REGISTRY} \
--remote-env IMAGE_NAME=${IMAGE_NAME} \
--remote-env REGISTRY_TOKEN=${REGISTRY_TOKEN} \
pnpm run buildx
2 changes: 2 additions & 0 deletions .config/cspell/cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@
"gitignoreRoot": ".",
"ignorePaths": ["LICENSE", "local.env"],
"words": [
"buildx",
"csharpierignore",
"csharpierrc",
"devcontainer",
"devcontainers",
"distroless",
"execa",
"globalconfig",
"msbuild",
Expand Down
2 changes: 1 addition & 1 deletion .config/dotnet/tools.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"isRoot": true,
"tools": {
"csharpier": {
"version": "1.0.0",
"version": "1.2.0",
"commands": ["csharpier"],
"rollForward": false
}
Expand Down
3 changes: 2 additions & 1 deletion .config/eslint/eslint.config.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import eslint from "@eslint/js";
import vitest from "@vitest/eslint-plugin";
import { defineConfig } from "eslint/config";
import prettier from "eslint-config-prettier";
import { gitignore } from "eslint-flat-config-gitignore";
import importPlugin from "eslint-plugin-import";
Expand All @@ -9,7 +10,7 @@ import eslintPluginUnicorn from "eslint-plugin-unicorn";
import globals from "globals";
import tsESLint from "typescript-eslint";

export default tsESLint.config(
export default defineConfig(
await gitignore(import.meta.dirname),
{
linterOptions: { reportUnusedDisableDirectives: true },
Expand Down
5 changes: 0 additions & 5 deletions .config/eslint/plugins.d.ts

This file was deleted.

2 changes: 0 additions & 2 deletions .config/git/ignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,3 @@ _*
local.env

node_modules/

dist/
1 change: 1 addition & 0 deletions .config/pnpm/rc
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
lockfile=false
resolution-mode=time-based
store-dir=/home/dev/.local/share/pnpm/store
global-bin-dir=/home/dev/.local/bin
4 changes: 2 additions & 2 deletions .config/typescript/tsconfig.node.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"extends": "@tsconfig/node22/tsconfig.json",
"extends": "@tsconfig/node24/tsconfig.json",
"compilerOptions": {
"resolveJsonModule": true,
"module": "Node18"
"module": "node18"
}
}
2 changes: 1 addition & 1 deletion .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
FROM mcr.microsoft.com/devcontainers/javascript-node:22
FROM mcr.microsoft.com/devcontainers/javascript-node:24-bookworm

RUN npm install --global pnpm@latest-10
2 changes: 1 addition & 1 deletion .devcontainer/compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ services:
devcontainer:
env_file:
- .env
- path: local.env
- path: ../.local/.env
required: false
build:
context: .
Expand Down
6 changes: 6 additions & 0 deletions ReadMe.md
Original file line number Diff line number Diff line change
@@ -1 +1,7 @@
# 🚧

```sh
alias create-devcontainer='docker run --rm -it \
-u $(id -u):$(id -g) -v ${PWD}:${PWD} -w ${PWD} \
ghcr.io/devcontainer-config/setup'
```
2 changes: 1 addition & 1 deletion Workspace.proj
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<Project>
<Sdk Name="Microsoft.Build.Traversal" Version="4.1.0" />
<Sdk Name="Microsoft.Build.Traversal" Version="4.1.82" />
<ItemGroup>
<ProjectReference
Include="$(MSBuildThisFileDirectory)**/*.csproj"
Expand Down
10 changes: 10 additions & 0 deletions docker/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
FROM --platform=linux/amd64 gcr.io/distroless/nodejs24-debian12 AS linux-amd64-base
FROM --platform=linux/arm64 gcr.io/distroless/nodejs24-debian12 AS linux-arm64-base

ARG TARGETOS
ARG TARGETARCH
FROM ${TARGETOS}-${TARGETARCH}-base

COPY .local/docker /etc/devcontainer-config-setup

ENTRYPOINT [ "/nodejs/bin/node", "/etc/devcontainer-config-setup/index.js" ]
2 changes: 2 additions & 0 deletions docker/Dockerfile.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
*
!.local/docker/
78 changes: 39 additions & 39 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,59 +3,59 @@
"license": "MIT",
"type": "module",
"scripts": {
"build": "pnpm node scripts/build.ts",
"fix": "pnpm node scripts/fix.ts",
"installPackage": "pnpm node scripts/installPackage.ts",
"lint": "pnpm node scripts/lint.ts",
"node": "vite-node scripts/node.ts",
"publish": "pnpm node scripts/publish.ts",
"push": "pnpm node scripts/push.ts",
"restore": "pnpm node scripts/restore.ts",
"test": "pnpm node scripts/test.ts",
"update": "pnpm node scripts/update.ts"
"build": "pnpm vite-node scripts/build.ts",
"buildx": "pnpm vite-node scripts/buildx.ts",
"fix": "pnpm vite-node scripts/fix.ts",
"installPackage": "pnpm vite-node scripts/installPackage.ts",
"lint": "pnpm vite-node scripts/lint.ts",
"publish": "pnpm vite-node scripts/publish.ts",
"push": "pnpm vite-node scripts/push.ts",
"restore": "pnpm vite-node scripts/restore.ts",
"test": "pnpm vite-node scripts/test.ts",
"update": "pnpm vite-node scripts/update.ts"
},
"dependencies": {
"@commander-js/extra-typings": "^14.0.0",
"@eslint/eslintrc": "^3.3.1",
"@eslint/js": "^9.28.0",
"@prettier/plugin-xml": "^3.4.1",
"@tsconfig/node22": "^22.0.2",
"@vitest/eslint-plugin": "^1.2.1",
"commander": "~14.0.0",
"cspell": "^9.0.2",
"eslint": "^9.28.0",
"eslint-config-prettier": "^10.1.5",
"@devcontainers/cli": "^0.80.1",
"@eslint/js": "^9.39.1",
"@prettier/plugin-xml": "^3.4.2",
"@tsconfig/node24": "^24.0.1",
"@vitest/eslint-plugin": "^1.4.2",
"commander": "~14.0.2",
"cspell": "^9.3.0",
"eslint": "^9.39.1",
"eslint-config-prettier": "^10.1.8",
"eslint-flat-config-gitignore": "^3.0.0",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-n": "^17.19.0",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-n": "^17.23.1",
"eslint-plugin-simple-import-sort": "^12.1.1",
"eslint-plugin-unicorn": "^59.0.1",
"eslint-plugin-unicorn": "^62.0.0",
"execa": "^9.6.0",
"glob": "^11.0.2",
"globals": "^16.2.0",
"isomorphic-git": "1.30.2",
"jiti": "^2.4.2",
"prettier": "^3.5.3",
"glob": "^11.0.3",
"globals": "^16.5.0",
"isomorphic-git": "1.35.0",
"jiti": "^2.6.1",
"prettier": "^3.6.2",
"prettier-plugin-ini": "^1.3.0",
"prettier-plugin-packagejson": "^2.5.15",
"prettier-plugin-sh": "^0.17.4",
"semver": "^7.7.2",
"prettier-plugin-packagejson": "^2.5.19",
"prettier-plugin-sh": "^0.18.0",
"semver": "^7.7.3",
"syncpack": "^13.0.4",
"type-fest": "^4.41.0",
"typescript": "~5.8.3",
"typescript-eslint": "^8.33.1",
"vite": "^6.3.5",
"vite-node": "^3.2.1",
"type-fest": "^5.2.0",
"typescript": "~5.9.3",
"typescript-eslint": "^8.46.3",
"vite": "^7.2.2",
"vite-node": "^5.0.0",
"vite-tsconfig-paths": "^5.1.4",
"vitest": "^3.2.1"
"vitest": "^4.0.8"
},
"devDependencies": {
"@types/eslint": "^9.6.1",
"@types/eslint-config-prettier": "^6.11.3",
"@types/node": "^22.15.29",
"@types/semver": "^7.7.0"
"@types/node": "^24.10.0",
"@types/semver": "^7.7.1"
},
"engines": {
"node": ">=22"
"node": ">=24"
}
}
48 changes: 48 additions & 0 deletions scripts/buildx.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import path from "node:path";

import { $ } from "execa";

import { projectRoot } from "@/scripts/project.js";
import { $$ } from "@/scripts/shell.js";
import { getVersionTag } from "@/scripts/tasks/build.js";
import { deploy } from "@/scripts/tasks/deploy.js";

const platforms: string[] = ["linux/amd64", "linux/arm64"];

const packagePath = path.resolve(projectRoot, ".local/docker");

async function buildImage(registry: string, imageName: string, tags: string[], publish: boolean) {
console.log("Building multi-arch Docker image...");

const dockerfilePath = path.join(projectRoot, "docker/Dockerfile");
const dockerPlatforms = platforms.join(",");

const args = ["buildx", "build", "--file", dockerfilePath, "--platform", dockerPlatforms];

for (const tag of tags) {
args.push("--tag", `${registry}/${imageName}:${tag}`);
}

if (publish) {
args.push("--push");
}

args.push(projectRoot);

await $$`docker ${args}`;
console.log("Docker image built successfully.");
}

const registry = process.env.REGISTRY ?? "local";
const imageName = process.env.IMAGE_NAME ?? "setup";
const version = await getVersionTag();
const tags = [version, "latest"];
const token = process.env.REGISTRY_TOKEN;
const publish = !!token;

if (publish) {
await $({ verbose: "full", input: token })`docker login ${registry} --username USERNAME --password-stdin`;
}

await deploy(packagePath);
await buildImage(registry, imageName, tags, publish);
45 changes: 2 additions & 43 deletions scripts/installPackage.ts
Original file line number Diff line number Diff line change
@@ -1,44 +1,3 @@
// eslint-disable-next-line n/no-unsupported-features/node-builtins
import { cp, mkdir, rm, writeFile } from "node:fs/promises";
import path from "node:path";
import { installPackage } from "@/scripts/tasks/installPackage.js";

import { $ } from "execa";

import { packagePrefix, projectRoot } from "@/scripts/project.js";
import { build } from "@/scripts/tasks/build.js";
import pkg from "@/setup/package.json" with { type: "json" };

const XDG_DATA_HOME = process.env.XDG_DATA_HOME;
if (!XDG_DATA_HOME) {
throw new Error("XDG_DATA_HOME is not set.");
}

await build();

// Copy the dist folder to a temporary location
const packageName = `${packagePrefix}${pkg.name}`;
const tempPath = `/tmp/${packageName}`;
await rm(tempPath, { recursive: true, force: true });
await mkdir(tempPath, { recursive: true });
await cp(path.resolve(projectRoot, pkg.name, "dist"), tempPath, { recursive: true });
await writeFile(path.resolve(tempPath, "pnpm-workspace.yaml"), "");
await writeFile(
path.resolve(tempPath, ".npmrc"),
[
"lockfile=false",
"resolution-mode=time-based",
"shared-workspace-lockfile=false",
"inject-workspace-packages=true",
].join("\n"),
);

// Install the package globally after pnpm deploy.
process.env.NODE_ENV = "production";
const installPath = path.resolve(XDG_DATA_HOME, pkg.name);
await rm(installPath, { recursive: true, force: true });
const $$ = $({ stdio: "inherit", verbose: "full", cwd: tempPath });
await $$`pnpm install`;
await $$`pnpm deploy --filter=${packageName} --prod ${installPath}`;
await $$`npm uninstall --global ${packageName}`;
await $$`npm install --global ${installPath}`;
await $$`rm --recursive ${tempPath}`;
await installPackage();
37 changes: 0 additions & 37 deletions scripts/node.ts

This file was deleted.

4 changes: 4 additions & 0 deletions scripts/project.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import path from "node:path";

export const projectName = "devcontainer-config-setup";

export const projectRoot = path.resolve(import.meta.dirname, "..");

export const workspaces = path.resolve(projectRoot, "..");

export const csProjectRoot = path.resolve(projectRoot, "setup/templates/csharp");

export const packagePrefix = "@devcontainer-config/";

export const packageOutputPath = path.resolve(projectRoot, `.local/dist`);
7 changes: 2 additions & 5 deletions scripts/publish.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import path from "node:path";

import { projectRoot } from "@/scripts/project.js";
import { packageOutputPath } from "@/scripts/project.js";
import { $$ } from "@/scripts/shell.js";
import pkg from "@/setup/package.json" with { type: "json" };

await $$`npm set //registry.npmjs.org/:_authToken=\${NPM_TOKEN}`;
await $$`npm publish --access public ${path.resolve(projectRoot, `${pkg.name}/dist`)}`;
await $$`npm publish --access public ${packageOutputPath}`;
11 changes: 10 additions & 1 deletion scripts/restore.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
import { cs$$ } from "@/scripts/shell.js";
import { $ } from "execa";

import { projectName } from "@/scripts/project.js";
import { $$, cs$$ } from "@/scripts/shell.js";

await cs$$`pnpm restore`;

// Create buildx builder
const { exitCode } = await $({ stdio: "ignore", reject: false })`docker buildx use ${projectName}`;
if (exitCode !== 0) {
await $$`docker buildx create --name ${projectName} --use --bootstrap --driver-opt network=host`;
}
Loading