web: Update build paths. Fix types.

This commit is contained in:
Teffen Ellis
2025-04-22 01:04:16 +02:00
committed by Teffen Ellis
parent 01b9369afb
commit 9382fdf8cd
8 changed files with 99 additions and 16 deletions

View File

@ -0,0 +1,42 @@
/**
* @file Utility functions for building and copying files.
*/
/**
* A source environment variable, which can be a string, number, boolean, null, or undefined.
* @typedef {string | number | boolean | null | undefined} EnvironmentVariable
*/
/**
* A type helper for serializing environment variables.
*
* @template {EnvironmentVariable} T
* @typedef {T extends string ? `"${T}"` : T} JSONify
*/
/**
* Given an object of environment variables, returns a new object with the same keys and values, but
* with the values serialized as strings.
*
* @template {Record<string, EnvironmentVariable>} EnvRecord
* @template {string} [Prefix='process.env.']
*
* @param {EnvRecord} input
* @param {Prefix} [prefix='process.env.']
*
* @returns {{[K in keyof EnvRecord as `${Prefix}${K}`]: JSONify<EnvRecord[K]>}}
*/
export function serializeEnvironmentVars(input, prefix = /** @type {Prefix} */ ("process.env.")) {
/**
* @type {Record<string, string>}
*/
const env = {};
for (const [key, value] of Object.entries(input)) {
const namespaceKey = prefix + key;
env[namespaceKey] = JSON.stringify(value || "");
}
return /** @type {any} */ (env);
}

View File

@ -1,8 +1,9 @@
/** /**
* @file Constants for JavaScript and TypeScript files. * @file Constants for JavaScript and TypeScript files.
*
*/ */
/// <reference types="../../types/global.js" />
/** /**
* The current Node.js environment, defaulting to "development" when not set. * The current Node.js environment, defaulting to "development" when not set.
* *
@ -12,6 +13,4 @@
* ensure that module tree-shaking works correctly. * ensure that module tree-shaking works correctly.
* *
*/ */
export const NodeEnvironment = /** @type {'development' | 'production'} */ ( export const NodeEnvironment = process.env.NODE_ENV || "development";
process.env.NODE_ENV || "development"
);

View File

@ -1,4 +1,7 @@
/// <reference types="./types/global.js" />
export * from "./paths.js"; export * from "./paths.js";
export * from "./constants.js"; export * from "./constants.js";
export * from "./build.js";
export * from "./version.js"; export * from "./version.js";
export * from "./scripting.js"; export * from "./scripting.js";

View File

@ -2,18 +2,27 @@
"name": "@goauthentik/monorepo", "name": "@goauthentik/monorepo",
"version": "1.0.0", "version": "1.0.0",
"description": "Utilities for the authentik monorepo.", "description": "Utilities for the authentik monorepo.",
"private": true,
"license": "MIT", "license": "MIT",
"private": true,
"main": "index.js",
"type": "module", "type": "module",
"exports": { "exports": {
"./package.json": "./package.json", "./package.json": "./package.json",
".": { ".": {
"import": "./index.js", "types": "./out/index.d.ts",
"types": "./out/index.d.ts" "import": "./index.js"
} }
}, },
"types": "./out/index.d.ts", "devDependencies": {
"@goauthentik/prettier-config": "^1.0.4",
"@goauthentik/tsconfig": "^1.0.4",
"@types/node": "^22.14.1",
"prettier": "^3.3.3",
"typescript": "^5.6.2"
},
"engines": { "engines": {
"node": ">=20.11" "node": ">=20.11"
} },
"types": "./out/index.d.ts",
"prettier": "@goauthentik/prettier-config"
} }

View File

@ -2,7 +2,7 @@ import { createRequire } from "node:module";
import { dirname, join, resolve } from "node:path"; import { dirname, join, resolve } from "node:path";
import { fileURLToPath } from "node:url"; import { fileURLToPath } from "node:url";
const __dirname = dirname(fileURLToPath(import.meta.url)); const relativeDirname = dirname(fileURLToPath(import.meta.url));
/** /**
* @typedef {'~authentik'} MonoRepoRoot * @typedef {'~authentik'} MonoRepoRoot
@ -11,20 +11,35 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
/** /**
* The root of the authentik monorepo. * The root of the authentik monorepo.
*/ */
export const MonoRepoRoot = /** @type {MonoRepoRoot} */ (resolve(__dirname, "..", "..")); // TODO: Revise when this package is moved to the monorepo's `packages/monorepo` directory.
export const MonoRepoRoot = /** @type {MonoRepoRoot} */ (
resolve(relativeDirname, "..", "..", "..")
);
const require = createRequire(import.meta.url); const require = createRequire(import.meta.url);
/** /**
* Resolve a package name to its location in the monorepo to the single node_modules directory. * Resolve a package name to its location in the monorepo to the single node_modules directory.
* @param {string} packageName * @param {string} packageName
*
* @returns {string} The resolved path to the package. * @returns {string} The resolved path to the package.
* @throws {Error} If the package cannot be resolved. * @throws {Error} If the package cannot be resolved.
*/ */
export function resolvePackage(packageName) { export function resolvePackage(packageName) {
const packageJSONPath = require.resolve(join(packageName, "package.json"), { const relativePackageJSONPath = join(packageName, "package.json");
paths: [MonoRepoRoot],
});
return dirname(packageJSONPath); /** @type {string} */
let absolutePackageJSONPath;
try {
absolutePackageJSONPath = require.resolve(relativePackageJSONPath);
} catch (cause) {
const error = new Error(`Failed to resolve package "${packageName}"`);
error.cause = cause;
throw error;
}
return dirname(absolutePackageJSONPath);
} }

15
web/packages/monorepo/types/global.d.ts vendored Normal file
View File

@ -0,0 +1,15 @@
declare module "process" {
global {
namespace NodeJS {
interface ProcessEnv {
/**
* An environment variable used to determine
* whether Node.js is running in production mode.
*
* @see {@link https://nodejs.org/en/learn/getting-started/nodejs-the-difference-between-development-and-production | The difference between development and production}
*/
NODE_ENV?: "production" | "development";
}
}
}
}

View File

@ -1,6 +1,6 @@
import { execSync } from "node:child_process"; import { execSync } from "node:child_process";
import PackageJSON from "../../package.json" with { type: "json" }; import PackageJSON from "../../../package.json" with { type: "json" };
import { MonoRepoRoot } from "./paths.js"; import { MonoRepoRoot } from "./paths.js";
/** /**