feat(bootstrap): Bun-workspace skeleton + typed config + vendored modules — T02
- Bun workspaces (packages/* + bootstrap); Pulumi nodejs runtime under
packagemanager: bun (no npm fallback needed).
- bootstrap/config.ts: typed FoundationConfig per CONTRACT_001; loadConfig()
fails closed, aggregating all missing+malformed keys in one error. Reads flat
dotted keys; image digests excluded (they live in VERSIONS, D5).
- bootstrap/Pulumi.foundation.yaml: non-secret placeholders only (RFC-5737 vm.host,
.invalid offsite); no encryptionsalt/secrets committed (D2). pulumi preview = 0
resources under the passphrase provider via gitignored file:// state backend.
- Stage-1 vendoring: packages/pulumi-{docker,vault} as @olsitec/* (source-only,
logic unchanged). vault's 5 type-only imports from modules/olsitec re-homed
verbatim into pulumi-vault/olsitec-types.ts to keep the egg self-contained.
Realizes PLAN-002 §10 T02; ADR-005 / 000_TOPOLOGY.md §5 Stage-1.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
edc708b826
commit
57c4eadea7
26 changed files with 2758 additions and 0 deletions
72
bootstrap/Pulumi.foundation.yaml
Normal file
72
bootstrap/Pulumi.foundation.yaml
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
# Pulumi.foundation.yaml — stack config for the single `foundation` stack.
|
||||
#
|
||||
# THIS FILE CONTAINS NON-SECRET PLACEHOLDERS ONLY (CONTRACT_001 §1.2).
|
||||
# All keys here are reproducible/derivable and safe to commit in plaintext.
|
||||
#
|
||||
# NO secrets are committed yet (CONTRACT_001 §1.3). The secret keys
|
||||
# vaultCredentials:rootToken, vaultCredentials:unsealKeys,
|
||||
# foundation:cloudflareApiToken, foundation:backup.offsiteAccessKey/SecretKey
|
||||
# are added by LATER tasks as `secure: v1:…` passphrase-encrypted values
|
||||
# (T05 Vault init capture, etc.). There is intentionally NO `encryptionsalt`
|
||||
# line yet because no secret has been encrypted into this stack — committing an
|
||||
# encryptionsalt (or any secret material) is forbidden by baseline D2.
|
||||
#
|
||||
# OPERATOR NOTE: every `pulumi preview/up` under the passphrase provider rewrites
|
||||
# this file — it appends an `encryptionsalt:` line and quotes scalars ("2222",
|
||||
# "true"). Before committing, STRIP any `encryptionsalt:` line that Pulumi added
|
||||
# (no secret depends on it yet; D2 forbids committing it). The loader (config.ts)
|
||||
# reads scalars via getNumber/getBoolean, so quoted or unquoted both parse.
|
||||
#
|
||||
# Image digests are NOT here — they live in foundation/VERSIONS (determinism, D5).
|
||||
config:
|
||||
# --- identity / networking (CONTRACT_001) ---
|
||||
foundation:baseDomain: olsitec.de
|
||||
foundation:hosts.forge: forge.olsitec.de
|
||||
foundation:hosts.vault: vault.olsitec.de
|
||||
foundation:hosts.s3: s3.olsitec.de
|
||||
foundation:forgeSshPort: 2222
|
||||
|
||||
# --- deployment target (Docker-over-SSH provider; key path comes from ENV) ---
|
||||
# Placeholder VM coordinates — replaced with the real foundation VM in Phase 0 / T03+.
|
||||
foundation:vm.host: 192.0.2.10
|
||||
foundation:vm.user: deploy
|
||||
|
||||
# --- container plane (CONTRACT_003 §3.1) ---
|
||||
foundation:network.name: foundation-net
|
||||
foundation:network.subnet: 172.30.0.0/24
|
||||
foundation:dataRoot: /srv/foundation
|
||||
|
||||
# --- TLS strategy (day-zero starts internal-ca, switch to LE later — CONTRACT_001) ---
|
||||
foundation:tls.mode: internal-ca
|
||||
foundation:tls.acmeEmail: platform@olsitec.de
|
||||
|
||||
# --- fixed names (derived, non-secret; creds are generated → Vault) ---
|
||||
foundation:postgres.db: foundation
|
||||
foundation:postgres.forgejoDb: forgejo
|
||||
foundation:rustfs.buckets:
|
||||
- forgejo-packages
|
||||
- forgejo-artifacts
|
||||
- forgejo-lfs
|
||||
- foundation-backups
|
||||
foundation:forgejo.adminUser: platform-admin
|
||||
foundation:forgejo.orgName: olsitec
|
||||
# PLAN-001 §4a runner labels (docker + dind backends).
|
||||
foundation:runner.labels:
|
||||
- docker:docker://node:20-bookworm
|
||||
- dind:docker://-
|
||||
|
||||
# --- credential feature flags (ADR-002; selects what @pulumi/random generates) ---
|
||||
# NOTE: index.ts is a T02 no-op scaffold — these flags create NOTHING yet.
|
||||
# They are committed so the typed surface is complete and later tasks read them.
|
||||
foundation:features.postgres: true
|
||||
foundation:features.rustfs: true
|
||||
foundation:features.forgejo: true
|
||||
foundation:features.runner: true
|
||||
foundation:features.backup: true
|
||||
foundation:features.registry: true
|
||||
|
||||
# --- backup (offsite creds are SECRET → seeded later, not here) ---
|
||||
foundation:backup.bucket: foundation-backups
|
||||
foundation:backup.offsiteEndpoint: https://offsite.example.invalid:9000
|
||||
foundation:backup.retentionDaily: 7
|
||||
foundation:backup.retentionWeekly: 4
|
||||
18
bootstrap/Pulumi.yaml
Normal file
18
bootstrap/Pulumi.yaml
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
---
|
||||
name: foundation
|
||||
description: >-
|
||||
The olsitec-foundation bootstrap "egg" — one Pulumi project that deploys
|
||||
Forgejo + PostgreSQL + Vault + RustFS + Caddy as Docker containers on a single
|
||||
VM via @pulumi/docker over SSH (PLAN-002 §0, Layer 0). No K8s / ArgoCD / Helm.
|
||||
runtime:
|
||||
name: nodejs
|
||||
options:
|
||||
# Bun is the Olsitec-preferred package manager (footgun 16.3). Pulumi's
|
||||
# nodejs runtime supports it via `packagemanager: bun`. Bun resolves the
|
||||
# workspace `@olsitec/pulumi-*` packages from ../packages/* locally — no
|
||||
# registry needed at day-zero (the registry is part of what this builds).
|
||||
packagemanager: bun
|
||||
config:
|
||||
pulumi:tags:
|
||||
value:
|
||||
pulumi:template: typescript
|
||||
252
bootstrap/config.ts
Normal file
252
bootstrap/config.ts
Normal file
|
|
@ -0,0 +1,252 @@
|
|||
// config.ts
|
||||
//
|
||||
// Producer of the typed foundation config (CONTRACT_001 §1.1). Every component
|
||||
// in bootstrap/components/* consumes THIS — components MUST NOT read raw
|
||||
// pulumi.Config ad hoc (CONTRACT_001 "Ownership").
|
||||
//
|
||||
// Three (and only three) configuration channels exist (CONTRACT_001 §Interface):
|
||||
// 1. ENV PULUMI_CONFIG_PASSPHRASE (master passphrase — the only external secret)
|
||||
// SSH_PRIVATE_KEY_PATH (key reaching the VM; default ~/.ssh/id_rsa)
|
||||
// 2. VERSIONS foundation/VERSIONS (image DIGESTS + tool versions — NOT in Pulumi config)
|
||||
// 3. Pulumi config Pulumi.foundation.yaml (typed non-secret + passphrase-encrypted secrets)
|
||||
//
|
||||
// IMPORTANT: image digests live in VERSIONS (determinism, baseline D5 / PLAN-002 §7.1),
|
||||
// NOT in this config. `loadConfig()` deliberately does not read or validate any image
|
||||
// reference — that is the preflight/VERSIONS concern, resolved at container-build time
|
||||
// in later component tasks (T03+).
|
||||
//
|
||||
// CONFIG KEY SHAPE: the non-secret keys are stored FLAT with dotted names
|
||||
// (CONTRACT_001 §1.2: `foundation:hosts.forge`, `foundation:features.forgejo`, …).
|
||||
// Pulumi does NOT auto-assemble `hosts.forge` + `hosts.vault` into a `hosts` object,
|
||||
// so each leaf is read by its full dotted key via the typed accessor for its kind
|
||||
// (`get` for strings, `getNumber`, `getBoolean`, `getObject` for arrays). This also
|
||||
// makes the loader robust to Pulumi storing scalars as quoted strings.
|
||||
import * as pulumi from "@pulumi/pulumi";
|
||||
|
||||
/**
|
||||
* The single typed configuration surface for the `foundation` stack (CONTRACT_001 §1.1).
|
||||
* Realises PLAN-002 §3, §4.2. See CONTRACT_003 for the fixed container names/ports/network.
|
||||
*/
|
||||
export interface FoundationConfig {
|
||||
// --- identity / networking ---
|
||||
baseDomain: string; // "olsitec.de"
|
||||
hosts: {
|
||||
// public FQDNs terminated by Caddy
|
||||
forge: string; // "forge.olsitec.de" (Forgejo web/API/registry)
|
||||
vault: string; // "vault.olsitec.de" (Vault UI/API — internal-restricted)
|
||||
s3: string; // "s3.olsitec.de" (RustFS API, optional public)
|
||||
};
|
||||
forgeSshPort: number; // 2222 (git-over-ssh, published directly, not via Caddy)
|
||||
|
||||
// --- deployment target (Docker-over-SSH provider) ---
|
||||
vm: {
|
||||
host: string; // IP or DNS of the foundation VM
|
||||
user: string; // ssh user (e.g. "root" or "deploy")
|
||||
// private key path comes from ENV SSH_PRIVATE_KEY_PATH, never config
|
||||
};
|
||||
|
||||
// --- container plane (see CONTRACT_003 for names/ports) ---
|
||||
network: { name: string; subnet: string }; // "foundation-net", "172.30.0.0/24"
|
||||
dataRoot: string; // host path for bind mounts / named-volume root (e.g. "/srv/foundation")
|
||||
|
||||
// --- TLS strategy ---
|
||||
tls: {
|
||||
mode: "letsencrypt-dns01" | "internal-ca"; // day-zero may start internal-ca, switch later
|
||||
acmeEmail: string;
|
||||
// cloudflareApiToken is a SECRET (CONTRACT_001 §1.3) — not in this typed surface
|
||||
};
|
||||
|
||||
// --- service sizing / fixed names (derived, non-secret) ---
|
||||
postgres: { db: string; forgejoDb: string }; // names only; creds are generated → Vault
|
||||
rustfs: { buckets: string[] }; // ["forgejo-packages","forgejo-artifacts","forgejo-lfs","foundation-backups"]
|
||||
forgejo: { adminUser: string; orgName: string }; // "platform-admin", "olsitec"
|
||||
runner: { labels: string[] }; // ["docker:docker://…","dind:docker://-"] (PLAN-001 §4a)
|
||||
|
||||
// --- credential feature flags (ADR-002 style; selects what @pulumi/random generates) ---
|
||||
features: {
|
||||
postgres: boolean;
|
||||
rustfs: boolean;
|
||||
forgejo: boolean;
|
||||
runner: boolean;
|
||||
backup: boolean;
|
||||
registry: boolean;
|
||||
};
|
||||
|
||||
// --- backup ---
|
||||
backup: {
|
||||
bucket: string; // "foundation-backups" (in RustFS)
|
||||
offsiteEndpoint: string; // self-hosted second location (CONTRACT_004); creds are SECRET
|
||||
retentionDaily: number;
|
||||
retentionWeekly: number;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* The SSH private key path is supplied by ENV (CONTRACT_001 §1: `SSH_PRIVATE_KEY_PATH`,
|
||||
* default ~/.ssh/id_rsa) — NEVER by Pulumi config. Exposed separately from
|
||||
* FoundationConfig because it is an operator/host concern, not stack state. Mirrors the
|
||||
* proven olsitec-core/config.ts pattern.
|
||||
*/
|
||||
export function sshPrivateKeyPath(): string {
|
||||
const home = process.env.HOME ?? "";
|
||||
return process.env.SSH_PRIVATE_KEY_PATH || `${home}/.ssh/id_rsa`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads + validates the Pulumi config and returns the typed FoundationConfig.
|
||||
*
|
||||
* Fails CLOSED (CONTRACT_001 "Ownership", "Validation"): every required key is read
|
||||
* defensively; any that is missing OR malformed is collected, and a single error
|
||||
* listing ALL of them is thrown — so `pulumi preview` on an under-populated stack
|
||||
* reports the whole gap at once (acceptance T02), not one key at a time.
|
||||
*
|
||||
* Secrets (CONTRACT_001 §1.3: vaultCredentials:*, foundation:cloudflareApiToken,
|
||||
* foundation:backup.offsite*Key) are NOT required here — they are seeded by later
|
||||
* tasks. This loader validates only the non-secret typed surface (§1.2).
|
||||
*/
|
||||
export function loadConfig(): FoundationConfig {
|
||||
const c = new pulumi.Config("foundation");
|
||||
|
||||
const missing: string[] = [];
|
||||
const malformed: string[] = [];
|
||||
|
||||
// --- typed leaf readers: record a missing/malformed key, return undefined on failure ---
|
||||
const reqStr = (key: string): string | undefined => {
|
||||
const v = c.get(key);
|
||||
if (v === undefined || v === "") {
|
||||
missing.push(`foundation:${key}`);
|
||||
return undefined;
|
||||
}
|
||||
return v;
|
||||
};
|
||||
const reqNum = (key: string): number | undefined => {
|
||||
if (c.get(key) === undefined) {
|
||||
missing.push(`foundation:${key}`);
|
||||
return undefined;
|
||||
}
|
||||
try {
|
||||
return c.requireNumber(key);
|
||||
} catch {
|
||||
malformed.push(`foundation:${key} must be a number`);
|
||||
return undefined;
|
||||
}
|
||||
};
|
||||
const reqBool = (key: string): boolean | undefined => {
|
||||
if (c.get(key) === undefined) {
|
||||
missing.push(`foundation:${key}`);
|
||||
return undefined;
|
||||
}
|
||||
try {
|
||||
return c.requireBoolean(key);
|
||||
} catch {
|
||||
malformed.push(`foundation:${key} must be a boolean`);
|
||||
return undefined;
|
||||
}
|
||||
};
|
||||
const reqStrArr = (key: string): string[] | undefined => {
|
||||
if (c.get(key) === undefined) {
|
||||
missing.push(`foundation:${key}`);
|
||||
return undefined;
|
||||
}
|
||||
const v = c.getObject<unknown>(key);
|
||||
if (
|
||||
!Array.isArray(v) ||
|
||||
v.length === 0 ||
|
||||
!v.every((x) => typeof x === "string")
|
||||
) {
|
||||
malformed.push(`foundation:${key} must be a non-empty string[]`);
|
||||
return undefined;
|
||||
}
|
||||
return v as string[];
|
||||
};
|
||||
|
||||
// --- read every required non-secret key (CONTRACT_001 §1.1 / §1.2) ---
|
||||
const baseDomain = reqStr("baseDomain");
|
||||
const hostsForge = reqStr("hosts.forge");
|
||||
const hostsVault = reqStr("hosts.vault");
|
||||
const hostsS3 = reqStr("hosts.s3");
|
||||
const forgeSshPort = reqNum("forgeSshPort");
|
||||
const vmHost = reqStr("vm.host");
|
||||
const vmUser = reqStr("vm.user");
|
||||
const networkName = reqStr("network.name");
|
||||
const networkSubnet = reqStr("network.subnet");
|
||||
const dataRoot = reqStr("dataRoot");
|
||||
const tlsModeRaw = reqStr("tls.mode");
|
||||
const tlsAcmeEmail = reqStr("tls.acmeEmail");
|
||||
const postgresDb = reqStr("postgres.db");
|
||||
const postgresForgejoDb = reqStr("postgres.forgejoDb");
|
||||
const rustfsBuckets = reqStrArr("rustfs.buckets");
|
||||
const forgejoAdminUser = reqStr("forgejo.adminUser");
|
||||
const forgejoOrgName = reqStr("forgejo.orgName");
|
||||
const runnerLabels = reqStrArr("runner.labels");
|
||||
const fPostgres = reqBool("features.postgres");
|
||||
const fRustfs = reqBool("features.rustfs");
|
||||
const fForgejo = reqBool("features.forgejo");
|
||||
const fRunner = reqBool("features.runner");
|
||||
const fBackup = reqBool("features.backup");
|
||||
const fRegistry = reqBool("features.registry");
|
||||
const backupBucket = reqStr("backup.bucket");
|
||||
const backupOffsiteEndpoint = reqStr("backup.offsiteEndpoint");
|
||||
const backupRetentionDaily = reqNum("backup.retentionDaily");
|
||||
const backupRetentionWeekly = reqNum("backup.retentionWeekly");
|
||||
|
||||
// tls.mode is an enum — validate only if it was present.
|
||||
if (
|
||||
tlsModeRaw !== undefined &&
|
||||
tlsModeRaw !== "letsencrypt-dns01" &&
|
||||
tlsModeRaw !== "internal-ca"
|
||||
) {
|
||||
malformed.push(
|
||||
`foundation:tls.mode must be "letsencrypt-dns01" | "internal-ca" (got ${JSON.stringify(tlsModeRaw)})`,
|
||||
);
|
||||
}
|
||||
|
||||
// --- fail closed: report ALL missing, then ALL malformed, in one error ---
|
||||
if (missing.length > 0) {
|
||||
throw new Error(
|
||||
"Foundation config validation FAILED (CONTRACT_001). " +
|
||||
`${missing.length} required key(s) missing from the 'foundation' stack:\n` +
|
||||
missing.map((k) => ` - ${k}`).join("\n") +
|
||||
"\nSet them in Pulumi.foundation.yaml (non-secret) and re-run. " +
|
||||
"Image digests are NOT config — they live in foundation/VERSIONS.",
|
||||
);
|
||||
}
|
||||
if (malformed.length > 0) {
|
||||
throw new Error(
|
||||
"Foundation config validation FAILED (CONTRACT_001) — malformed value(s):\n" +
|
||||
malformed.map((m) => ` - ${m}`).join("\n"),
|
||||
);
|
||||
}
|
||||
|
||||
// All keys present + well-typed past this point (the `!` are now sound).
|
||||
return {
|
||||
baseDomain: baseDomain!,
|
||||
hosts: { forge: hostsForge!, vault: hostsVault!, s3: hostsS3! },
|
||||
forgeSshPort: forgeSshPort!,
|
||||
vm: { host: vmHost!, user: vmUser! },
|
||||
network: { name: networkName!, subnet: networkSubnet! },
|
||||
dataRoot: dataRoot!,
|
||||
tls: {
|
||||
mode: tlsModeRaw as FoundationConfig["tls"]["mode"],
|
||||
acmeEmail: tlsAcmeEmail!,
|
||||
},
|
||||
postgres: { db: postgresDb!, forgejoDb: postgresForgejoDb! },
|
||||
rustfs: { buckets: rustfsBuckets! },
|
||||
forgejo: { adminUser: forgejoAdminUser!, orgName: forgejoOrgName! },
|
||||
runner: { labels: runnerLabels! },
|
||||
features: {
|
||||
postgres: fPostgres!,
|
||||
rustfs: fRustfs!,
|
||||
forgejo: fForgejo!,
|
||||
runner: fRunner!,
|
||||
backup: fBackup!,
|
||||
registry: fRegistry!,
|
||||
},
|
||||
backup: {
|
||||
bucket: backupBucket!,
|
||||
offsiteEndpoint: backupOffsiteEndpoint!,
|
||||
retentionDaily: backupRetentionDaily!,
|
||||
retentionWeekly: backupRetentionWeekly!,
|
||||
},
|
||||
};
|
||||
}
|
||||
37
bootstrap/index.ts
Normal file
37
bootstrap/index.ts
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
// index.ts — the foundation egg entrypoint (PLAN-002 §0, Layer 0).
|
||||
//
|
||||
// T02 SCAFFOLD STATE: this entrypoint is intentionally a NO-OP beyond config
|
||||
// validation. It calls loadConfig() so that `pulumi preview` exercises the
|
||||
// CONTRACT_001 fail-closed validation (acceptance T02), but it creates NO real
|
||||
// resources yet. The data plane / Vault / RustFS / Postgres / Forgejo / Caddy /
|
||||
// runner components are LATER tasks (PLAN-002 §10: T03–T15) and are deliberately
|
||||
// NOT authored here.
|
||||
import * as pulumi from "@pulumi/pulumi";
|
||||
|
||||
import { loadConfig, sshPrivateKeyPath } from "./config";
|
||||
|
||||
// Fail closed here: if required config is missing/malformed, loadConfig throws
|
||||
// and `pulumi preview` reports the full gap (CONTRACT_001 §Validation).
|
||||
const config = loadConfig();
|
||||
|
||||
// The vendored @olsitec/pulumi-docker provider (CONTRACT_003) will, in T03+, use
|
||||
// this key path + config.vm.{host,user} to reach the foundation VM over SSH.
|
||||
// Resolved here only to prove the ENV channel is wired; not yet consumed.
|
||||
const sshKeyPath = sshPrivateKeyPath();
|
||||
|
||||
pulumi.log.info(
|
||||
`foundation config loaded (no-op scaffold): ` +
|
||||
`baseDomain=${config.baseDomain}, vm=${config.vm.user}@${config.vm.host}, ` +
|
||||
`network=${config.network.name} (${config.network.subnet}), tls=${config.tls.mode}`,
|
||||
);
|
||||
|
||||
// Stack outputs — safe, non-secret echoes so `pulumi preview`/`up` has something
|
||||
// to show while no resources exist. Replaced by real component outputs in T03+.
|
||||
export const phase = "T02-scaffold";
|
||||
export const baseDomain = config.baseDomain;
|
||||
export const networkName = config.network.name;
|
||||
export const vmTarget = pulumi.interpolate`${config.vm.user}@${config.vm.host}`;
|
||||
export const sshKeyConfigured = sshKeyPath.length > 0;
|
||||
export const enabledFeatures = Object.entries(config.features)
|
||||
.filter(([, on]) => on)
|
||||
.map(([name]) => name);
|
||||
16
bootstrap/package.json
Normal file
16
bootstrap/package.json
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"name": "@olsitec/foundation-bootstrap",
|
||||
"private": true,
|
||||
"version": "0.0.0",
|
||||
"main": "index.ts",
|
||||
"description": "The foundation egg — single Pulumi project (PLAN-002 §0, Layer 0).",
|
||||
"dependencies": {
|
||||
"@olsitec/pulumi-docker": "workspace:*",
|
||||
"@olsitec/pulumi-vault": "workspace:*",
|
||||
"@pulumi/pulumi": "^3.138.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^18",
|
||||
"typescript": "^5.0.0"
|
||||
}
|
||||
}
|
||||
19
bootstrap/tsconfig.json
Normal file
19
bootstrap/tsconfig.json
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"strict": true,
|
||||
"outDir": "bin",
|
||||
"target": "es2020",
|
||||
"module": "commonjs",
|
||||
"moduleResolution": "node",
|
||||
"sourceMap": true,
|
||||
"experimentalDecorators": true,
|
||||
"pretty": true,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"noImplicitReturns": true,
|
||||
"forceConsistentCasingInFileNames": true
|
||||
},
|
||||
"files": [
|
||||
"config.ts",
|
||||
"index.ts"
|
||||
]
|
||||
}
|
||||
837
bun.lock
Normal file
837
bun.lock
Normal file
|
|
@ -0,0 +1,837 @@
|
|||
{
|
||||
"lockfileVersion": 1,
|
||||
"configVersion": 1,
|
||||
"workspaces": {
|
||||
"": {
|
||||
"name": "@olsitec/foundation",
|
||||
"devDependencies": {
|
||||
"typescript": "^5.0.0",
|
||||
},
|
||||
},
|
||||
"bootstrap": {
|
||||
"name": "@olsitec/foundation-bootstrap",
|
||||
"version": "0.0.0",
|
||||
"dependencies": {
|
||||
"@olsitec/pulumi-docker": "workspace:*",
|
||||
"@olsitec/pulumi-vault": "workspace:*",
|
||||
"@pulumi/pulumi": "^3.138.0",
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^18",
|
||||
"typescript": "^5.0.0",
|
||||
},
|
||||
},
|
||||
"packages/pulumi-docker": {
|
||||
"name": "@olsitec/pulumi-docker",
|
||||
"version": "0.0.0",
|
||||
"dependencies": {
|
||||
"@pulumi/docker": "^4.5.8",
|
||||
"@pulumi/pulumi": "^3.138.0",
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/eslintrc": "^3.1.0",
|
||||
"@pulumi/eslint-plugin": "^0.2.0",
|
||||
"@typescript-eslint/eslint-plugin": "^8.13.0",
|
||||
"eslint-config-prettier": "^9.1.0",
|
||||
"prettier": "^3.3.3",
|
||||
"typescript": "^5.0.0",
|
||||
},
|
||||
},
|
||||
"packages/pulumi-vault": {
|
||||
"name": "@olsitec/pulumi-vault",
|
||||
"version": "0.0.0",
|
||||
"dependencies": {
|
||||
"@pulumi/pulumi": "^3.138.0",
|
||||
"@pulumi/random": "^4.16.8",
|
||||
"@pulumi/vault": "^4.5.8",
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/eslintrc": "^3.1.0",
|
||||
"@pulumi/eslint-plugin": "^0.2.0",
|
||||
"@typescript-eslint/eslint-plugin": "^8.13.0",
|
||||
"eslint-config-prettier": "^9.1.0",
|
||||
"prettier": "^3.3.3",
|
||||
"typescript": "^5.0.0",
|
||||
},
|
||||
},
|
||||
},
|
||||
"packages": {
|
||||
"@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="],
|
||||
|
||||
"@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="],
|
||||
|
||||
"@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="],
|
||||
|
||||
"@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="],
|
||||
|
||||
"@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="],
|
||||
|
||||
"@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="],
|
||||
|
||||
"@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="],
|
||||
|
||||
"@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="],
|
||||
|
||||
"@gar/promise-retry": ["@gar/promise-retry@1.0.3", "", {}, "sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA=="],
|
||||
|
||||
"@grpc/grpc-js": ["@grpc/grpc-js@1.14.4", "", { "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ=="],
|
||||
|
||||
"@grpc/proto-loader": ["@grpc/proto-loader@0.8.1", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.5.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg=="],
|
||||
|
||||
"@humanfs/core": ["@humanfs/core@0.19.2", "", { "dependencies": { "@humanfs/types": "^0.15.0" } }, "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA=="],
|
||||
|
||||
"@humanfs/node": ["@humanfs/node@0.16.8", "", { "dependencies": { "@humanfs/core": "^0.19.2", "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ=="],
|
||||
|
||||
"@humanfs/types": ["@humanfs/types@0.15.0", "", {}, "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q=="],
|
||||
|
||||
"@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
|
||||
|
||||
"@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="],
|
||||
|
||||
"@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="],
|
||||
|
||||
"@isaacs/string-locale-compare": ["@isaacs/string-locale-compare@1.1.0", "", {}, "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ=="],
|
||||
|
||||
"@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="],
|
||||
|
||||
"@logdna/tail-file": ["@logdna/tail-file@2.2.0", "", {}, "sha512-XGSsWDweP80Fks16lwkAUIr54ICyBs6PsI4mpfTLQaWgEJRtY9xEV+PeyDpJ+sJEGZxqINlpmAwe/6tS1pP8Ng=="],
|
||||
|
||||
"@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
|
||||
|
||||
"@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
|
||||
|
||||
"@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
|
||||
|
||||
"@npmcli/agent": ["@npmcli/agent@4.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^11.2.1", "socks-proxy-agent": "^8.0.3" } }, "sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg=="],
|
||||
|
||||
"@npmcli/arborist": ["@npmcli/arborist@9.9.0", "", { "dependencies": { "@gar/promise-retry": "^1.0.0", "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/fs": "^5.0.0", "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/map-workspaces": "^5.0.0", "@npmcli/metavuln-calculator": "^9.0.2", "@npmcli/name-from-folder": "^4.0.0", "@npmcli/node-gyp": "^5.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/query": "^5.0.0", "@npmcli/redact": "^4.0.0", "@npmcli/run-script": "^10.0.0", "bin-links": "^6.0.0", "cacache": "^20.0.1", "common-ancestor-path": "^2.0.0", "hosted-git-info": "^9.0.0", "json-stringify-nice": "^1.1.4", "lru-cache": "^11.2.1", "minimatch": "^10.0.3", "nopt": "^9.0.0", "npm-install-checks": "^8.0.0", "npm-package-arg": "^13.0.0", "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", "pacote": "^21.0.2", "parse-conflict-json": "^5.0.1", "proc-log": "^6.0.0", "proggy": "^4.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^3.0.1", "semver": "^7.3.7", "ssri": "^13.0.0", "treeverse": "^3.0.0", "walk-up-path": "^4.0.0" }, "bin": { "arborist": "bin/index.js" } }, "sha512-tzsb1R8mx0k0drlLDT/9ckEYaQHIaWnUti/ci2IaFoQqdqwfmYrc+90p1+QEZC/ocvqcxBep9P1xKw4FbAGofw=="],
|
||||
|
||||
"@npmcli/fs": ["@npmcli/fs@5.0.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og=="],
|
||||
|
||||
"@npmcli/git": ["@npmcli/git@7.0.2", "", { "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/promise-spawn": "^9.0.0", "ini": "^6.0.0", "lru-cache": "^11.2.1", "npm-pick-manifest": "^11.0.1", "proc-log": "^6.0.0", "semver": "^7.3.5", "which": "^6.0.0" } }, "sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg=="],
|
||||
|
||||
"@npmcli/installed-package-contents": ["@npmcli/installed-package-contents@4.0.0", "", { "dependencies": { "npm-bundled": "^5.0.0", "npm-normalize-package-bin": "^5.0.0" }, "bin": { "installed-package-contents": "bin/index.js" } }, "sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA=="],
|
||||
|
||||
"@npmcli/map-workspaces": ["@npmcli/map-workspaces@5.0.3", "", { "dependencies": { "@npmcli/name-from-folder": "^4.0.0", "@npmcli/package-json": "^7.0.0", "glob": "^13.0.0", "minimatch": "^10.0.3" } }, "sha512-o2grssXo1e774E5OtEwwrgoszYRh0lqkJH+Pb9r78UcqdGJRDRfhpM8DvZPjzNLLNYeD/rNbjOKM3Ss5UABROw=="],
|
||||
|
||||
"@npmcli/metavuln-calculator": ["@npmcli/metavuln-calculator@9.0.3", "", { "dependencies": { "cacache": "^20.0.0", "json-parse-even-better-errors": "^5.0.0", "pacote": "^21.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5" } }, "sha512-94GLSYhLXF2t2LAC7pDwLaM4uCARzxShyAQKsirmlNcpidH89VA4/+K1LbJmRMgz5gy65E/QBBWQdUvGLe2Frg=="],
|
||||
|
||||
"@npmcli/name-from-folder": ["@npmcli/name-from-folder@4.0.0", "", {}, "sha512-qfrhVlOSqmKM8i6rkNdZzABj8MKEITGFAY+4teqBziksCQAOLutiAxM1wY2BKEd8KjUSpWmWCYxvXr0y4VTlPg=="],
|
||||
|
||||
"@npmcli/node-gyp": ["@npmcli/node-gyp@5.0.0", "", {}, "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ=="],
|
||||
|
||||
"@npmcli/package-json": ["@npmcli/package-json@7.0.5", "", { "dependencies": { "@npmcli/git": "^7.0.0", "glob": "^13.0.0", "hosted-git-info": "^9.0.0", "json-parse-even-better-errors": "^5.0.0", "proc-log": "^6.0.0", "semver": "^7.5.3", "spdx-expression-parse": "^4.0.0" } }, "sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ=="],
|
||||
|
||||
"@npmcli/promise-spawn": ["@npmcli/promise-spawn@9.0.1", "", { "dependencies": { "which": "^6.0.0" } }, "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q=="],
|
||||
|
||||
"@npmcli/query": ["@npmcli/query@5.0.0", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" } }, "sha512-8TZWfTQOsODpLqo9SVhVjHovmKXNpevHU0gO9e+y4V4fRIOneiXy0u0sMP9LmS71XivrEWfZWg50ReH4WRT4aQ=="],
|
||||
|
||||
"@npmcli/redact": ["@npmcli/redact@4.0.0", "", {}, "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q=="],
|
||||
|
||||
"@npmcli/run-script": ["@npmcli/run-script@10.0.4", "", { "dependencies": { "@npmcli/node-gyp": "^5.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^9.0.0", "node-gyp": "^12.1.0", "proc-log": "^6.0.0" } }, "sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg=="],
|
||||
|
||||
"@olsitec/foundation-bootstrap": ["@olsitec/foundation-bootstrap@workspace:bootstrap"],
|
||||
|
||||
"@olsitec/pulumi-docker": ["@olsitec/pulumi-docker@workspace:packages/pulumi-docker"],
|
||||
|
||||
"@olsitec/pulumi-vault": ["@olsitec/pulumi-vault@workspace:packages/pulumi-vault"],
|
||||
|
||||
"@opentelemetry/api": ["@opentelemetry/api@1.9.1", "", {}, "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q=="],
|
||||
|
||||
"@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="],
|
||||
|
||||
"@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@1.30.1", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA=="],
|
||||
|
||||
"@opentelemetry/core": ["@opentelemetry/core@1.30.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ=="],
|
||||
|
||||
"@opentelemetry/exporter-trace-otlp-grpc": ["@opentelemetry/exporter-trace-otlp-grpc@0.57.2", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "1.30.1", "@opentelemetry/otlp-exporter-base": "0.57.2", "@opentelemetry/otlp-grpc-exporter-base": "0.57.2", "@opentelemetry/otlp-transformer": "0.57.2", "@opentelemetry/resources": "1.30.1", "@opentelemetry/sdk-trace-base": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-gHU1vA3JnHbNxEXg5iysqCWxN9j83d7/epTYBZflqQnTyCC4N7yZXn/dMM+bEmyhQPGjhCkNZLx4vZuChH1PYw=="],
|
||||
|
||||
"@opentelemetry/exporter-zipkin": ["@opentelemetry/exporter-zipkin@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", "@opentelemetry/sdk-trace-base": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-6S2QIMJahIquvFaaxmcwpvQQRD/YFaMTNoIxrfPIPOeITN+a8lfEcPDxNxn8JDAaxkg+4EnXhz8upVDYenoQjA=="],
|
||||
|
||||
"@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="],
|
||||
|
||||
"@opentelemetry/instrumentation-grpc": ["@opentelemetry/instrumentation-grpc@0.57.2", "", { "dependencies": { "@opentelemetry/instrumentation": "0.57.2", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-TR6YQA67cLSZzdxbf2SrbADJy2Y8eBW1+9mF15P0VK2MYcpdoUSmQTF1oMkBwa3B9NwqDFA2fq7wYTTutFQqaQ=="],
|
||||
|
||||
"@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.57.2", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/otlp-transformer": "0.57.2" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-XdxEzL23Urhidyebg5E6jZoaiW5ygP/mRjxLHixogbqwDy2Faduzb5N0o/Oi+XTIJu+iyxXdVORjXax+Qgfxag=="],
|
||||
|
||||
"@opentelemetry/otlp-grpc-exporter-base": ["@opentelemetry/otlp-grpc-exporter-base@0.57.2", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "1.30.1", "@opentelemetry/otlp-exporter-base": "0.57.2", "@opentelemetry/otlp-transformer": "0.57.2" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-USn173KTWy0saqqRB5yU9xUZ2xdgb1Rdu5IosJnm9aV4hMTuFFRTUsQxbgc24QxpCHeoKzzCSnS/JzdV0oM2iQ=="],
|
||||
|
||||
"@opentelemetry/otlp-transformer": ["@opentelemetry/otlp-transformer@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", "@opentelemetry/sdk-logs": "0.57.2", "@opentelemetry/sdk-metrics": "1.30.1", "@opentelemetry/sdk-trace-base": "1.30.1", "protobufjs": "^7.3.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-48IIRj49gbQVK52jYsw70+Jv+JbahT8BqT2Th7C4H7RCM9d0gZ5sgNPoMpWldmfjvIsSgiGJtjfk9MeZvjhoig=="],
|
||||
|
||||
"@opentelemetry/propagator-b3": ["@opentelemetry/propagator-b3@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-oATwWWDIJzybAZ4pO76ATN5N6FFbOA1otibAVlS8v90B4S1wClnhRUk7K+2CHAwN1JKYuj4jh/lpCEG5BAqFuQ=="],
|
||||
|
||||
"@opentelemetry/propagator-jaeger": ["@opentelemetry/propagator-jaeger@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-Pj/BfnYEKIOImirH76M4hDaBSx6HyZ2CXUqk+Kj02m6BB80c/yo4BdWkn/1gDFfU+YPY+bPR2U0DKBfdxCKwmg=="],
|
||||
|
||||
"@opentelemetry/resources": ["@opentelemetry/resources@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA=="],
|
||||
|
||||
"@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-TXFHJ5c+BKggWbdEQ/inpgIzEmS2BGQowLE9UhsMd7YYlUfBQJ4uax0VF/B5NYigdM/75OoJGhAV3upEhK+3gg=="],
|
||||
|
||||
"@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog=="],
|
||||
|
||||
"@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg=="],
|
||||
|
||||
"@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@1.30.1", "", { "dependencies": { "@opentelemetry/context-async-hooks": "1.30.1", "@opentelemetry/core": "1.30.1", "@opentelemetry/propagator-b3": "1.30.1", "@opentelemetry/propagator-jaeger": "1.30.1", "@opentelemetry/sdk-trace-base": "1.30.1", "semver": "^7.5.2" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-cBjYOINt1JxXdpw1e5MlHmFRc5fgj4GW/86vsKFxJCJ8AL4PdVtYH41gWwl4qd4uQjqEL1oJVrXkSy5cnduAnQ=="],
|
||||
|
||||
"@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="],
|
||||
|
||||
"@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="],
|
||||
|
||||
"@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="],
|
||||
|
||||
"@protobufjs/codegen": ["@protobufjs/codegen@2.0.5", "", {}, "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g=="],
|
||||
|
||||
"@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.1", "", {}, "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg=="],
|
||||
|
||||
"@protobufjs/fetch": ["@protobufjs/fetch@1.1.1", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1" } }, "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw=="],
|
||||
|
||||
"@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="],
|
||||
|
||||
"@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="],
|
||||
|
||||
"@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="],
|
||||
|
||||
"@protobufjs/utf8": ["@protobufjs/utf8@1.1.1", "", {}, "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg=="],
|
||||
|
||||
"@pulumi/docker": ["@pulumi/docker@4.11.2", "", { "dependencies": { "@pulumi/pulumi": "^3.142.0", "semver": "^5.4.0" } }, "sha512-mm8Uscb/3S7OieYyg1E/vvFx3OS4bAkZvtFvi1yTqYda9NbnYOMbJi7a5fU5xB0N0Kd/uliS8olJ/e6nnvVVPg=="],
|
||||
|
||||
"@pulumi/eslint-plugin": ["@pulumi/eslint-plugin@0.2.0", "", { "dependencies": { "@typescript-eslint/type-utils": "^5.33.1", "@typescript-eslint/typescript-estree": "^5.33.1", "@typescript-eslint/utils": "^5.33.1", "tsutils": "^3.21.0", "typescript": "^4.7.4" } }, "sha512-tb2Wo1pO8kmNIt+ECkVd7ykRHgadFJfddjLG8Of002X+qbRkNZNttdt55o7EdCDHGB6Dn1RFo/MJYNuHjYn/Dg=="],
|
||||
|
||||
"@pulumi/pulumi": ["@pulumi/pulumi@3.248.0", "", { "dependencies": { "@grpc/grpc-js": "^1.10.1", "@logdna/tail-file": "^2.0.6", "@npmcli/arborist": "^9.0.0", "@opentelemetry/api": "^1.9", "@opentelemetry/exporter-trace-otlp-grpc": "^0.57", "@opentelemetry/exporter-zipkin": "^1.30", "@opentelemetry/instrumentation": "^0.57", "@opentelemetry/instrumentation-grpc": "^0.57", "@opentelemetry/resources": "^1.30", "@opentelemetry/sdk-trace-base": "^1.30", "@opentelemetry/sdk-trace-node": "^1.30", "@types/google-protobuf": "^3.15.5", "@types/semver": "^7.5.6", "@types/tmp": "^0.2.6", "execa": "^5.1.0", "fdir": "^6.5.0", "google-protobuf": "^3.21.4", "ini": "^2.0.0", "js-yaml": "^4.0.0", "minimist": "^1.2.6", "normalize-package-data": "^6.0.0", "picomatch": "^4.0.0", "require-from-string": "^2.0.1", "semver": "^7.5.2", "source-map-support": "^0.5.6", "tmp": "^0.2.4", "upath": "^1.1.0" }, "peerDependencies": { "ts-node": ">= 7.0.1 < 12", "typescript": ">= 3.8.3 < 7" }, "optionalPeers": ["ts-node", "typescript"] }, "sha512-EqgeHjVIqMS8voAM7F8SOzFAMHnVXUDdKTNF1o3Lg85YwVI0j4/eIlWG0iIVAWJl3DX0KOOM6++X0wLKHWWwmQ=="],
|
||||
|
||||
"@pulumi/random": ["@pulumi/random@4.21.0", "", { "dependencies": { "@pulumi/pulumi": "^3.142.0" } }, "sha512-k4JHqQFOKXWkbSLZtX37xBlRsurfgZbLd1Zib0cLSDP4Dt3uTllR3CBWfMLSnXJGAoTr9MlwyHCer/5tmSaF0Q=="],
|
||||
|
||||
"@pulumi/vault": ["@pulumi/vault@4.6.0", "", { "dependencies": { "@pulumi/pulumi": "^3.0.0" } }, "sha512-GFZjgDaPg8cCl5gD1xM7ilYrkILqq1kOLCcKOlfMQe2jvjN2JUhW7+Hm3WJ3lyYVKqklLr2NV25ZeAhRgPTFJA=="],
|
||||
|
||||
"@sigstore/bundle": ["@sigstore/bundle@4.0.0", "", { "dependencies": { "@sigstore/protobuf-specs": "^0.5.0" } }, "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A=="],
|
||||
|
||||
"@sigstore/core": ["@sigstore/core@3.2.1", "", {}, "sha512-qRsxPnCrbC/puegGxKuynfnxgLiHqWStrSjxkoB4YKqq3Z3s4cyZyj42ZdWFAEblNP65C+rBH8EuREHIXoi83g=="],
|
||||
|
||||
"@sigstore/protobuf-specs": ["@sigstore/protobuf-specs@0.5.1", "", {}, "sha512-/ScWUhhoFasJsSRGTVBwId1loQjjnjAfE4djL6ZhrXRpNCmPTnUKF5Jokd58ILseOMjzET3UrMOtJPS9sYeI0g=="],
|
||||
|
||||
"@sigstore/sign": ["@sigstore/sign@4.1.1", "", { "dependencies": { "@gar/promise-retry": "^1.0.2", "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.2.0", "@sigstore/protobuf-specs": "^0.5.0", "make-fetch-happen": "^15.0.4", "proc-log": "^6.1.0" } }, "sha512-Hf4xglukg0XXQ2RiD5vSoLjdPe8OBUPA8XeVjUObheuDcWdYWrnH/BNmxZCzkAy68MzmNCxXLeurJvs6hcP2OQ=="],
|
||||
|
||||
"@sigstore/tuf": ["@sigstore/tuf@4.0.2", "", { "dependencies": { "@sigstore/protobuf-specs": "^0.5.0", "tuf-js": "^4.1.0" } }, "sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ=="],
|
||||
|
||||
"@sigstore/verify": ["@sigstore/verify@3.1.1", "", { "dependencies": { "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.2.1", "@sigstore/protobuf-specs": "^0.5.0" } }, "sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA=="],
|
||||
|
||||
"@tufjs/canonical-json": ["@tufjs/canonical-json@2.0.0", "", {}, "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA=="],
|
||||
|
||||
"@tufjs/models": ["@tufjs/models@4.1.0", "", { "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^10.1.1" } }, "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww=="],
|
||||
|
||||
"@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="],
|
||||
|
||||
"@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="],
|
||||
|
||||
"@types/google-protobuf": ["@types/google-protobuf@3.15.12", "", {}, "sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ=="],
|
||||
|
||||
"@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
|
||||
|
||||
"@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="],
|
||||
|
||||
"@types/semver": ["@types/semver@7.7.1", "", {}, "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA=="],
|
||||
|
||||
"@types/shimmer": ["@types/shimmer@1.2.0", "", {}, "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg=="],
|
||||
|
||||
"@types/tmp": ["@types/tmp@0.2.6", "", {}, "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.62.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.62.1", "@typescript-eslint/type-utils": "8.62.1", "@typescript-eslint/utils": "8.62.1", "@typescript-eslint/visitor-keys": "8.62.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.62.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-4EQM77WgVNxj7OkL/5b/D/xZsw00G577+UriYTC7JF5opcF3T2AuoeY7ueLaZgSVjSgCS6yOAJB5bRGLPSJUzA=="],
|
||||
|
||||
"@typescript-eslint/parser": ["@typescript-eslint/parser@8.62.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.62.1", "@typescript-eslint/types": "8.62.1", "@typescript-eslint/typescript-estree": "8.62.1", "@typescript-eslint/visitor-keys": "8.62.1", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-sPhE4iHuJDSvoAiec+Ro8JyXw8f0ql13HFR82P99nCm9GwTEKG0KYLvDe6REk8BCXuit6vJAv/Yxg5ABaNS2rA=="],
|
||||
|
||||
"@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.62.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.62.1", "@typescript-eslint/types": "^8.62.1", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-yQ3RgY5RkSBpsNS1Bx/JQEcA24FOSdfGktoyprAr5u18390UQdtVcfnEv4nIrIshNnavlVyZBKxQwT1fIAE6cg=="],
|
||||
|
||||
"@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.62.1", "", { "dependencies": { "@typescript-eslint/types": "8.62.1", "@typescript-eslint/visitor-keys": "8.62.1" } }, "sha512-r4d249KbQ1SFdpeStvob8Ih6aPPIzfqllPVOtvhve6ZcpuVcYo5/7zUWckKpHE7StASX4kTKZTLf0WQm/wPkcg=="],
|
||||
|
||||
"@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.62.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-xadytJqX9vJVQ2fdQjkcIVigwaOJNWkpjdLt6cEQ+xPnrI1fkp+/jZE/I97k9KUjqtpd25i0HeyZf3T6dutv2g=="],
|
||||
|
||||
"@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@5.62.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "5.62.0", "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "peerDependencies": { "eslint": "*" } }, "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew=="],
|
||||
|
||||
"@typescript-eslint/types": ["@typescript-eslint/types@5.62.0", "", {}, "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ=="],
|
||||
|
||||
"@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@5.62.0", "", { "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "semver": "^7.3.7", "tsutils": "^3.21.0" } }, "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA=="],
|
||||
|
||||
"@typescript-eslint/utils": ["@typescript-eslint/utils@5.62.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ=="],
|
||||
|
||||
"@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.62.1", "", { "dependencies": { "@typescript-eslint/types": "8.62.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g=="],
|
||||
|
||||
"abbrev": ["abbrev@4.0.0", "", {}, "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA=="],
|
||||
|
||||
"acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="],
|
||||
|
||||
"acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="],
|
||||
|
||||
"acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
|
||||
|
||||
"agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
|
||||
|
||||
"ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="],
|
||||
|
||||
"ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||
|
||||
"ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
|
||||
|
||||
"array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="],
|
||||
|
||||
"balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
|
||||
|
||||
"bin-links": ["bin-links@6.0.2", "", { "dependencies": { "cmd-shim": "^8.0.0", "npm-normalize-package-bin": "^5.0.0", "proc-log": "^6.0.0", "read-cmd-shim": "^6.0.0", "write-file-atomic": "^7.0.0" } }, "sha512-frE1t78WOwJ45PKV2cF2tNPjTcs9L1J9s6VkrV59wanRP4GlaomuxYPVma7BwthMg8WnfSory4w5PTE6FZZ81w=="],
|
||||
|
||||
"brace-expansion": ["brace-expansion@1.1.15", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg=="],
|
||||
|
||||
"braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
|
||||
|
||||
"buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
|
||||
|
||||
"cacache": ["cacache@20.0.4", "", { "dependencies": { "@npmcli/fs": "^5.0.0", "fs-minipass": "^3.0.0", "glob": "^13.0.0", "lru-cache": "^11.1.0", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", "ssri": "^13.0.0" } }, "sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA=="],
|
||||
|
||||
"callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
|
||||
|
||||
"chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="],
|
||||
|
||||
"cjs-module-lexer": ["cjs-module-lexer@1.4.3", "", {}, "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q=="],
|
||||
|
||||
"cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
|
||||
|
||||
"cmd-shim": ["cmd-shim@8.0.0", "", {}, "sha512-Jk/BK6NCapZ58BKUxlSI+ouKRbjH1NLZCgJkYoab+vEHUY3f6OzpNBN9u7HFSv9J6TRDGs4PLOHezoKGaFRSCA=="],
|
||||
|
||||
"color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
|
||||
|
||||
"color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
|
||||
|
||||
"common-ancestor-path": ["common-ancestor-path@2.0.0", "", {}, "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng=="],
|
||||
|
||||
"concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
|
||||
|
||||
"cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
|
||||
|
||||
"cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
|
||||
|
||||
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
|
||||
|
||||
"deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
|
||||
|
||||
"dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="],
|
||||
|
||||
"emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
|
||||
|
||||
"env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="],
|
||||
|
||||
"es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
|
||||
|
||||
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
|
||||
|
||||
"escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
|
||||
|
||||
"eslint": ["eslint@10.6.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg=="],
|
||||
|
||||
"eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="],
|
||||
|
||||
"eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="],
|
||||
|
||||
"eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="],
|
||||
|
||||
"espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="],
|
||||
|
||||
"esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="],
|
||||
|
||||
"esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
|
||||
|
||||
"estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="],
|
||||
|
||||
"esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
|
||||
|
||||
"execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="],
|
||||
|
||||
"exponential-backoff": ["exponential-backoff@3.1.3", "", {}, "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA=="],
|
||||
|
||||
"fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
|
||||
|
||||
"fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
|
||||
|
||||
"fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
|
||||
|
||||
"fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
|
||||
|
||||
"fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="],
|
||||
|
||||
"fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
|
||||
|
||||
"file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
|
||||
|
||||
"fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
|
||||
|
||||
"find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
|
||||
|
||||
"flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],
|
||||
|
||||
"flatted": ["flatted@3.4.2", "", {}, "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA=="],
|
||||
|
||||
"fs-minipass": ["fs-minipass@3.0.3", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw=="],
|
||||
|
||||
"function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
|
||||
|
||||
"get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
|
||||
|
||||
"get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
|
||||
|
||||
"glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="],
|
||||
|
||||
"glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
|
||||
|
||||
"globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
|
||||
|
||||
"globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="],
|
||||
|
||||
"google-protobuf": ["google-protobuf@3.21.4", "", {}, "sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ=="],
|
||||
|
||||
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
|
||||
|
||||
"hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="],
|
||||
|
||||
"hosted-git-info": ["hosted-git-info@9.0.3", "", { "dependencies": { "lru-cache": "^11.1.0" } }, "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg=="],
|
||||
|
||||
"http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="],
|
||||
|
||||
"http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="],
|
||||
|
||||
"https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
|
||||
|
||||
"human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="],
|
||||
|
||||
"iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],
|
||||
|
||||
"ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
|
||||
|
||||
"ignore-walk": ["ignore-walk@8.0.0", "", { "dependencies": { "minimatch": "^10.0.3" } }, "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A=="],
|
||||
|
||||
"import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
|
||||
|
||||
"import-in-the-middle": ["import-in-the-middle@1.15.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^1.2.2", "module-details-from-path": "^1.0.3" } }, "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA=="],
|
||||
|
||||
"imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
|
||||
|
||||
"ini": ["ini@2.0.0", "", {}, "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="],
|
||||
|
||||
"ip-address": ["ip-address@10.2.0", "", {}, "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA=="],
|
||||
|
||||
"is-core-module": ["is-core-module@2.16.2", "", { "dependencies": { "hasown": "^2.0.3" } }, "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA=="],
|
||||
|
||||
"is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
|
||||
|
||||
"is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
|
||||
|
||||
"is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
|
||||
|
||||
"is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
|
||||
|
||||
"is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
|
||||
|
||||
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
|
||||
|
||||
"js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="],
|
||||
|
||||
"json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
|
||||
|
||||
"json-parse-even-better-errors": ["json-parse-even-better-errors@5.0.0", "", {}, "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ=="],
|
||||
|
||||
"json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
|
||||
|
||||
"json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
|
||||
|
||||
"json-stringify-nice": ["json-stringify-nice@1.1.4", "", {}, "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw=="],
|
||||
|
||||
"jsonparse": ["jsonparse@1.3.1", "", {}, "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg=="],
|
||||
|
||||
"just-diff": ["just-diff@6.0.2", "", {}, "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA=="],
|
||||
|
||||
"just-diff-apply": ["just-diff-apply@5.5.0", "", {}, "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw=="],
|
||||
|
||||
"keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
|
||||
|
||||
"levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
|
||||
|
||||
"locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
|
||||
|
||||
"lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="],
|
||||
|
||||
"long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="],
|
||||
|
||||
"lru-cache": ["lru-cache@11.5.1", "", {}, "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A=="],
|
||||
|
||||
"make-fetch-happen": ["make-fetch-happen@15.0.6", "", { "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/agent": "^4.0.0", "@npmcli/redact": "^4.0.0", "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", "minipass-fetch": "^5.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", "proc-log": "^6.0.0", "ssri": "^13.0.0" } }, "sha512-Je0fLJ0F5atA7F+eIlLzk+Wkcl57JDf4kf+EW8xiP5E31xOQxkIxTbgf1Oi1Lw9tRI9UEMRdI5Vz2xTzoNU1Jw=="],
|
||||
|
||||
"merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="],
|
||||
|
||||
"merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
|
||||
|
||||
"micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
|
||||
|
||||
"mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
|
||||
|
||||
"minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="],
|
||||
|
||||
"minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
|
||||
|
||||
"minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="],
|
||||
|
||||
"minipass-collect": ["minipass-collect@2.0.1", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw=="],
|
||||
|
||||
"minipass-fetch": ["minipass-fetch@5.0.2", "", { "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^2.0.0", "minizlib": "^3.0.1" }, "optionalDependencies": { "iconv-lite": "^0.7.2" } }, "sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ=="],
|
||||
|
||||
"minipass-flush": ["minipass-flush@1.0.7", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA=="],
|
||||
|
||||
"minipass-pipeline": ["minipass-pipeline@1.2.4", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A=="],
|
||||
|
||||
"minipass-sized": ["minipass-sized@2.0.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA=="],
|
||||
|
||||
"minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="],
|
||||
|
||||
"module-details-from-path": ["module-details-from-path@1.0.4", "", {}, "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w=="],
|
||||
|
||||
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
||||
|
||||
"natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
|
||||
|
||||
"negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
|
||||
|
||||
"node-gyp": ["node-gyp@12.4.0", "", { "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", "nopt": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "tar": "^7.5.4", "tinyglobby": "^0.2.12", "undici": "^6.25.0", "which": "^6.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw=="],
|
||||
|
||||
"nopt": ["nopt@9.0.0", "", { "dependencies": { "abbrev": "^4.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw=="],
|
||||
|
||||
"normalize-package-data": ["normalize-package-data@6.0.2", "", { "dependencies": { "hosted-git-info": "^7.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g=="],
|
||||
|
||||
"npm-bundled": ["npm-bundled@5.0.0", "", { "dependencies": { "npm-normalize-package-bin": "^5.0.0" } }, "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw=="],
|
||||
|
||||
"npm-install-checks": ["npm-install-checks@8.0.0", "", { "dependencies": { "semver": "^7.1.1" } }, "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA=="],
|
||||
|
||||
"npm-normalize-package-bin": ["npm-normalize-package-bin@5.0.0", "", {}, "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag=="],
|
||||
|
||||
"npm-package-arg": ["npm-package-arg@13.0.2", "", { "dependencies": { "hosted-git-info": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^7.0.0" } }, "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA=="],
|
||||
|
||||
"npm-packlist": ["npm-packlist@10.0.4", "", { "dependencies": { "ignore-walk": "^8.0.0", "proc-log": "^6.0.0" } }, "sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng=="],
|
||||
|
||||
"npm-pick-manifest": ["npm-pick-manifest@11.0.3", "", { "dependencies": { "npm-install-checks": "^8.0.0", "npm-normalize-package-bin": "^5.0.0", "npm-package-arg": "^13.0.0", "semver": "^7.3.5" } }, "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ=="],
|
||||
|
||||
"npm-registry-fetch": ["npm-registry-fetch@19.1.1", "", { "dependencies": { "@npmcli/redact": "^4.0.0", "jsonparse": "^1.3.1", "make-fetch-happen": "^15.0.0", "minipass": "^7.0.2", "minipass-fetch": "^5.0.0", "minizlib": "^3.0.1", "npm-package-arg": "^13.0.0", "proc-log": "^6.0.0" } }, "sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw=="],
|
||||
|
||||
"npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="],
|
||||
|
||||
"onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="],
|
||||
|
||||
"optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],
|
||||
|
||||
"p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
|
||||
|
||||
"p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
|
||||
|
||||
"p-map": ["p-map@7.0.5", "", {}, "sha512-e8vJF4XdVkzqqSHguEMz41mQO1wKwxKm5ENrUJQUu9kLDCtn83cxbyHZcszr4QC5zEA7WffRRC4gsTecC7J9oA=="],
|
||||
|
||||
"pacote": ["pacote@21.5.1", "", { "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/git": "^7.0.0", "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^9.0.0", "@npmcli/run-script": "^10.0.0", "cacache": "^20.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^13.0.0", "npm-packlist": "^10.0.1", "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", "proc-log": "^6.0.0", "sigstore": "^4.0.0", "ssri": "^13.0.0", "tar": "^7.4.3" }, "bin": { "pacote": "bin/index.js" } }, "sha512-KvcJ9iy3crysCsgqc4+PknH/w6jkrp8JN36mpZBPwNaDRwTfMZD37YzRazNstiZUOhuF5pno9f78n9mEJBavwg=="],
|
||||
|
||||
"parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
|
||||
|
||||
"parse-conflict-json": ["parse-conflict-json@5.0.1", "", { "dependencies": { "json-parse-even-better-errors": "^5.0.0", "just-diff": "^6.0.0", "just-diff-apply": "^5.2.0" } }, "sha512-ZHEmNKMq1wyJXNwLxyHnluPfRAFSIliBvbK/UiOceROt4Xh9Pz0fq49NytIaeaCUf5VR86hwQ/34FCcNU5/LKQ=="],
|
||||
|
||||
"path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
|
||||
|
||||
"path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
|
||||
|
||||
"path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
|
||||
|
||||
"path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="],
|
||||
|
||||
"path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
|
||||
|
||||
"picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
|
||||
|
||||
"postcss-selector-parser": ["postcss-selector-parser@7.1.4", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg=="],
|
||||
|
||||
"prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
|
||||
|
||||
"prettier": ["prettier@3.9.4", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-yWG/o/4oJfo036EKAfK6ACAoDOfHeRHx4tuxkfBZiauURiaSmYwlpOr5LQqKtIkRD2z1PLteme2WoxEnj4tHTg=="],
|
||||
|
||||
"proc-log": ["proc-log@6.1.0", "", {}, "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ=="],
|
||||
|
||||
"proggy": ["proggy@4.0.0", "", {}, "sha512-MbA4R+WQT76ZBm/5JUpV9yqcJt92175+Y0Bodg3HgiXzrmKu7Ggq+bpn6y6wHH+gN9NcyKn3yg1+d47VaKwNAQ=="],
|
||||
|
||||
"promise-all-reject-late": ["promise-all-reject-late@1.0.1", "", {}, "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw=="],
|
||||
|
||||
"promise-call-limit": ["promise-call-limit@3.0.2", "", {}, "sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw=="],
|
||||
|
||||
"protobufjs": ["protobufjs@7.6.4", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.5", "@protobufjs/eventemitter": "^1.1.1", "@protobufjs/fetch": "^1.1.1", "@protobufjs/float": "^1.0.2", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.1", "@types/node": ">=13.7.0", "long": "^5.3.2" } }, "sha512-RJJPTTpvFfHcWLkIa2JFWK4XvtSzS0yEWDmunqHXli1h3JlkbcQZXDZdcWxv+JK3Xsl5/UFDPZ0iGm7DAengYw=="],
|
||||
|
||||
"punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
|
||||
|
||||
"queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
|
||||
|
||||
"read-cmd-shim": ["read-cmd-shim@6.0.0", "", {}, "sha512-1zM5HuOfagXCBWMN83fuFI/x+T/UhZ7k+KIzhrHXcQoeX5+7gmaDYjELQHmmzIodumBHeByBJT4QYS7ufAgs7A=="],
|
||||
|
||||
"require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="],
|
||||
|
||||
"require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
|
||||
|
||||
"require-in-the-middle": ["require-in-the-middle@7.5.2", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3", "resolve": "^1.22.8" } }, "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ=="],
|
||||
|
||||
"resolve": ["resolve@1.22.12", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA=="],
|
||||
|
||||
"resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
|
||||
|
||||
"reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
|
||||
|
||||
"run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
|
||||
|
||||
"safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
|
||||
|
||||
"semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="],
|
||||
|
||||
"shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
|
||||
|
||||
"shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
|
||||
|
||||
"shimmer": ["shimmer@1.2.1", "", {}, "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="],
|
||||
|
||||
"signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
|
||||
|
||||
"sigstore": ["sigstore@4.1.1", "", { "dependencies": { "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.2.1", "@sigstore/protobuf-specs": "^0.5.0", "@sigstore/sign": "^4.1.1", "@sigstore/tuf": "^4.0.2", "@sigstore/verify": "^3.1.1" } }, "sha512-endqECJkfhozrXMK5ngu/UAA0xVcVEFdnHJCElGaExypjW+HK5i6zu3NteLoaX/iFbRUbC3+DjttQs0GARr+5w=="],
|
||||
|
||||
"slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="],
|
||||
|
||||
"smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="],
|
||||
|
||||
"socks": ["socks@2.8.9", "", { "dependencies": { "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" } }, "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw=="],
|
||||
|
||||
"socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="],
|
||||
|
||||
"source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
|
||||
|
||||
"source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="],
|
||||
|
||||
"spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="],
|
||||
|
||||
"spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="],
|
||||
|
||||
"spdx-expression-parse": ["spdx-expression-parse@4.0.0", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ=="],
|
||||
|
||||
"spdx-license-ids": ["spdx-license-ids@3.0.23", "", {}, "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw=="],
|
||||
|
||||
"ssri": ["ssri@13.0.1", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ=="],
|
||||
|
||||
"string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
||||
|
||||
"strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||
|
||||
"strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="],
|
||||
|
||||
"strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
|
||||
|
||||
"supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
|
||||
|
||||
"tar": ["tar@7.5.19", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-4LeEWl96twnS2Q7Bz4MGqgazLqO+hJN63GZxXoIqh1T3VweYD997gbU1ItNsQafqqXTXd5WFyFdReLtwvRBNiw=="],
|
||||
|
||||
"tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="],
|
||||
|
||||
"tmp": ["tmp@0.2.7", "", {}, "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw=="],
|
||||
|
||||
"to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
|
||||
|
||||
"treeverse": ["treeverse@3.0.0", "", {}, "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ=="],
|
||||
|
||||
"ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="],
|
||||
|
||||
"tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="],
|
||||
|
||||
"tsutils": ["tsutils@3.21.0", "", { "dependencies": { "tslib": "^1.8.1" }, "peerDependencies": { "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA=="],
|
||||
|
||||
"tuf-js": ["tuf-js@4.1.0", "", { "dependencies": { "@tufjs/models": "4.1.0", "debug": "^4.4.3", "make-fetch-happen": "^15.0.1" } }, "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ=="],
|
||||
|
||||
"type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
|
||||
|
||||
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
|
||||
|
||||
"undici": ["undici@6.27.0", "", {}, "sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg=="],
|
||||
|
||||
"undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="],
|
||||
|
||||
"upath": ["upath@1.2.0", "", {}, "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="],
|
||||
|
||||
"uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
|
||||
|
||||
"util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
|
||||
|
||||
"validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="],
|
||||
|
||||
"validate-npm-package-name": ["validate-npm-package-name@7.0.2", "", {}, "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A=="],
|
||||
|
||||
"walk-up-path": ["walk-up-path@4.0.0", "", {}, "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A=="],
|
||||
|
||||
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
|
||||
|
||||
"word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
|
||||
|
||||
"wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
|
||||
|
||||
"write-file-atomic": ["write-file-atomic@7.0.1", "", { "dependencies": { "signal-exit": "^4.0.1" } }, "sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg=="],
|
||||
|
||||
"y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
|
||||
|
||||
"yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="],
|
||||
|
||||
"yargs": ["yargs@17.7.3", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g=="],
|
||||
|
||||
"yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
|
||||
|
||||
"yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
|
||||
|
||||
"@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
||||
|
||||
"@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
|
||||
|
||||
"@npmcli/arborist/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
|
||||
|
||||
"@npmcli/git/ini": ["ini@6.0.0", "", {}, "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ=="],
|
||||
|
||||
"@npmcli/git/which": ["which@6.0.1", "", { "dependencies": { "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg=="],
|
||||
|
||||
"@npmcli/map-workspaces/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
|
||||
|
||||
"@npmcli/promise-spawn/which": ["which@6.0.1", "", { "dependencies": { "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg=="],
|
||||
|
||||
"@pulumi/docker/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="],
|
||||
|
||||
"@pulumi/eslint-plugin/typescript": ["typescript@4.9.5", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g=="],
|
||||
|
||||
"@tufjs/models/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.62.1", "", { "dependencies": { "@typescript-eslint/types": "8.62.1", "@typescript-eslint/typescript-estree": "8.62.1", "@typescript-eslint/utils": "8.62.1", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-aXM5xlqXiTxPibXB93cLAURfT3rlizf7uMXISCXy66Isr/9hISJx3yDsKl0L7lKa51b8JpFuNKby0/O0pEm9jg=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@8.62.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.62.1", "@typescript-eslint/types": "8.62.1", "@typescript-eslint/typescript-estree": "8.62.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-sHtbPfuKNZCG+ih8SyjjucqRntSVmp8XgL5u6o9mAhiSn8ds5o/M/XdM0abweme2Tln3szOstOrZ9OXitvPh0g=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
|
||||
|
||||
"@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@8.62.1", "", {}, "sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q=="],
|
||||
|
||||
"@typescript-eslint/parser/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.62.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.62.1", "@typescript-eslint/tsconfig-utils": "8.62.1", "@typescript-eslint/types": "8.62.1", "@typescript-eslint/visitor-keys": "8.62.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL5ZrdCiQsAA=="],
|
||||
|
||||
"@typescript-eslint/project-service/@typescript-eslint/types": ["@typescript-eslint/types@8.62.1", "", {}, "sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q=="],
|
||||
|
||||
"@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@8.62.1", "", {}, "sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q=="],
|
||||
|
||||
"@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@5.62.0", "", { "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" } }, "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw=="],
|
||||
|
||||
"@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@5.62.0", "", { "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0" } }, "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w=="],
|
||||
|
||||
"@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@8.62.1", "", {}, "sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q=="],
|
||||
|
||||
"@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="],
|
||||
|
||||
"eslint/eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="],
|
||||
|
||||
"eslint/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="],
|
||||
|
||||
"eslint/espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="],
|
||||
|
||||
"eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
|
||||
|
||||
"esquery/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
|
||||
|
||||
"esrecurse/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
|
||||
|
||||
"fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
|
||||
|
||||
"glob/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
|
||||
|
||||
"ignore-walk/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
|
||||
|
||||
"micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
|
||||
|
||||
"minipass-flush/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
|
||||
|
||||
"minipass-pipeline/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
|
||||
|
||||
"node-gyp/which": ["which@6.0.1", "", { "dependencies": { "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg=="],
|
||||
|
||||
"normalize-package-data/hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="],
|
||||
|
||||
"spdx-correct/spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="],
|
||||
|
||||
"validate-npm-package-license/spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="],
|
||||
|
||||
"write-file-atomic/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
|
||||
|
||||
"@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.7", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA=="],
|
||||
|
||||
"@npmcli/arborist/minimatch/brace-expansion": ["brace-expansion@5.0.7", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA=="],
|
||||
|
||||
"@npmcli/git/which/isexe": ["isexe@4.0.0", "", {}, "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw=="],
|
||||
|
||||
"@npmcli/map-workspaces/minimatch/brace-expansion": ["brace-expansion@5.0.7", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA=="],
|
||||
|
||||
"@npmcli/promise-spawn/which/isexe": ["isexe@4.0.0", "", {}, "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw=="],
|
||||
|
||||
"@tufjs/models/minimatch/brace-expansion": ["brace-expansion@5.0.7", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/types": ["@typescript-eslint/types@8.62.1", "", {}, "sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.62.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.62.1", "@typescript-eslint/tsconfig-utils": "8.62.1", "@typescript-eslint/types": "8.62.1", "@typescript-eslint/visitor-keys": "8.62.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL5ZrdCiQsAA=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.62.1", "", {}, "sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.62.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.62.1", "@typescript-eslint/tsconfig-utils": "8.62.1", "@typescript-eslint/types": "8.62.1", "@typescript-eslint/visitor-keys": "8.62.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL5ZrdCiQsAA=="],
|
||||
|
||||
"@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
|
||||
|
||||
"@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
||||
|
||||
"@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@5.62.0", "", { "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" } }, "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw=="],
|
||||
|
||||
"eslint/eslint-scope/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
|
||||
|
||||
"eslint/minimatch/brace-expansion": ["brace-expansion@5.0.7", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA=="],
|
||||
|
||||
"glob/minimatch/brace-expansion": ["brace-expansion@5.0.7", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA=="],
|
||||
|
||||
"ignore-walk/minimatch/brace-expansion": ["brace-expansion@5.0.7", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA=="],
|
||||
|
||||
"minipass-flush/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
|
||||
|
||||
"minipass-pipeline/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
|
||||
|
||||
"node-gyp/which/isexe": ["isexe@4.0.0", "", {}, "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw=="],
|
||||
|
||||
"normalize-package-data/hosted-git-info/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
|
||||
|
||||
"@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
|
||||
|
||||
"@npmcli/arborist/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
|
||||
|
||||
"@npmcli/map-workspaces/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
|
||||
|
||||
"@tufjs/models/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
|
||||
|
||||
"@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.7", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA=="],
|
||||
|
||||
"@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
|
||||
|
||||
"eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
|
||||
|
||||
"glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
|
||||
|
||||
"ignore-walk/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.7", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.7", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA=="],
|
||||
|
||||
"@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
|
||||
|
||||
"@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
# T02 — Pulumi project skeleton + passphrase backend + `config.ts` — Subtask Outline
|
||||
|
||||
**Task:** PLAN-002 §10 T02 · **Mode:** BUILD (scaffolding; no deploy) · **Date:** 2026-06-30
|
||||
**Realizes:** CONTRACT_001 (config schema), 000_TOPOLOGY.md §5 Stage-1 vendoring, ADR-005.
|
||||
|
||||
## Goal
|
||||
|
||||
Scaffold the Bun-workspace mono-repo + the `bootstrap/` Pulumi egg with a typed
|
||||
config layer (CONTRACT_001), and vendor the `pulumi-docker` + `pulumi-vault` shared
|
||||
modules into `packages/`. No real VM, no `pulumi up`.
|
||||
|
||||
## Subtasks
|
||||
|
||||
1. **Workspace root** — `foundation/package.json` with `workspaces: ["packages/*","bootstrap"]`.
|
||||
2. **Vendor `@olsitec/pulumi-docker`** — copy olsicloud4 `modules/docker` source only; rename package; `VENDORED.md`.
|
||||
3. **Vendor `@olsitec/pulumi-vault`** — copy `modules/vault` (incl. `policy.ts`) source only; rename; `VENDORED.md`.
|
||||
- Sub-issue: upstream `index.ts` imports 5 **type-only** decls from `../../modules/olsitec` (which pulls in minio/gitlab/kubernetes). Re-homed those types verbatim into a local `olsitec-types.ts`; re-pointed the one import. No logic change.
|
||||
4. **`bootstrap/Pulumi.yaml`** — `name: foundation`, `runtime: nodejs` + `packagemanager: bun`.
|
||||
5. **`bootstrap/config.ts`** — `FoundationConfig` interface + `loadConfig()` that reads flat dotted Pulumi keys and FAILS CLOSED listing all missing/malformed required keys.
|
||||
6. **`bootstrap/index.ts`** — no-op scaffold; calls `loadConfig()` so preview exercises validation; creates no resources; exports a few non-secret outputs.
|
||||
7. **`bootstrap/Pulumi.foundation.yaml`** — NON-secret placeholders only (CONTRACT_001 §1.2). No secrets, no encryptionsalt.
|
||||
8. **Validate** — `bun install` links the workspace; `tsc --noEmit` on all three; `pulumi preview` under the **passphrase** provider + local file backend (`bootstrap/state/`, gitignored) + throwaway ENV passphrase. Demonstrate the fail-closed path.
|
||||
|
||||
## Key contracts honoured
|
||||
|
||||
- CONTRACT_001 §1.1 shape; §1.2 non-secret keys under `foundation:`; §1.3 secrets deferred.
|
||||
- CONTRACT_003 fixed names/ports/network referenced by the placeholder config.
|
||||
- Image digests come from `VERSIONS` (T01), not config.
|
||||
139
documentation/agents/task_002_pulumi_skeleton/003_handoff.md
Normal file
139
documentation/agents/task_002_pulumi_skeleton/003_handoff.md
Normal file
|
|
@ -0,0 +1,139 @@
|
|||
# T02 — Pulumi project skeleton — Handoff
|
||||
|
||||
**Task:** PLAN-002 §10 T02 · **Mode:** BUILD · **Date:** 2026-06-30
|
||||
**Author role:** implementation agent · **Status:** complete, validated by execution (see below).
|
||||
|
||||
> The lead reviews and commits. Nothing was `git add`/`git commit`ed by this task.
|
||||
|
||||
---
|
||||
|
||||
## 1. Files created / touched
|
||||
|
||||
### Workspace root
|
||||
- `package.json` — Bun workspace root (`@olsitec/foundation`, private, `workspaces: ["packages/*","bootstrap"]`).
|
||||
- Removed placeholders `bootstrap/.gitkeep`, `packages/.gitkeep` (replaced by real content).
|
||||
- `bun.lock` — generated by `bun install` (links the workspace; no secrets — verified).
|
||||
|
||||
### Vendored module `packages/pulumi-docker/` (`@olsitec/pulumi-docker`)
|
||||
- `index.ts`, `tsconfig.json`, `.editorconfig`, `.gitignore` — copied **verbatim** from
|
||||
`/Users/andiolsi/work/olsicloud4/pulumi/modules/docker/`.
|
||||
- `package.json` — renamed `docker` → `@olsitec/pulumi-docker`; added `version` `0.0.0`,
|
||||
`main`/`types` (`index.ts`), and an explicit `@pulumi/pulumi` dependency (see §4).
|
||||
- `VENDORED.md` — source path, copy date, Stage-1 note, Stage-2 deferral.
|
||||
|
||||
### Vendored module `packages/pulumi-vault/` (`@olsitec/pulumi-vault`)
|
||||
- `index.ts`, `policy.ts`, `tsconfig.json`, `.editorconfig`, `.gitignore` — copied **verbatim**
|
||||
from `/Users/andiolsi/work/olsicloud4/pulumi/modules/vault/`.
|
||||
- `olsitec-types.ts` — **NEW**: the 5 type-only declarations the upstream `index.ts` imported
|
||||
from `../../modules/olsitec`, copied verbatim (see §3). The single import line in `index.ts`
|
||||
was re-pointed `../../modules/olsitec` → `./olsitec-types`. No runtime logic changed.
|
||||
- `tsconfig.json` — `files` extended with `policy.ts` + `olsitec-types.ts` (standalone typecheck).
|
||||
- `package.json` — renamed `vault` → `@olsitec/pulumi-vault`; `version`/`main`/`types`; added
|
||||
explicit `@pulumi/pulumi` dependency (§4).
|
||||
- `VENDORED.md` — source path, copy date, Stage-1 note, the type-only re-home, and a flag that the
|
||||
inherited Layer-1 credential surface (`VaultProject`/minio/garage/…) is to be trimmed in a later
|
||||
Layer-0 refactor (NOT in Stage-1, which preserves source).
|
||||
|
||||
### `bootstrap/` (the egg, single Pulumi project)
|
||||
- `Pulumi.yaml` — `name: foundation`, `runtime: nodejs` + `options.packagemanager: bun`.
|
||||
- `package.json` — depends on `@olsitec/pulumi-docker`/`@olsitec/pulumi-vault` (`workspace:*`) + `@pulumi/pulumi`.
|
||||
- `tsconfig.json` — Olsitec-standard compiler options; `files: [config.ts, index.ts]`.
|
||||
- `config.ts` — `FoundationConfig` interface (CONTRACT_001 §1.1) + `loadConfig()` (fails closed) + `sshPrivateKeyPath()` (ENV).
|
||||
- `index.ts` — no-op scaffold: calls `loadConfig()`, creates NO resources, exports non-secret outputs.
|
||||
- `Pulumi.foundation.yaml` — NON-secret placeholders only; no secrets, no encryptionsalt.
|
||||
|
||||
### Documentation
|
||||
- `documentation/agents/task_002_pulumi_skeleton/000_subtask_outline.md`
|
||||
- `documentation/agents/task_002_pulumi_skeleton/003_handoff.md` (this file)
|
||||
|
||||
---
|
||||
|
||||
## 2. Validated-by-execution vs. authored-only
|
||||
|
||||
**Validated by running it (env: bun 1.3.9, pulumi v3.243.0, node v24.10.0, macOS):**
|
||||
- `bun install` links the workspace; `bun pm ls` shows all three workspace members;
|
||||
`require.resolve("@olsitec/pulumi-docker"|"@olsitec/pulumi-vault")` from `bootstrap` resolves to
|
||||
`packages/*/index.ts`. ✅ (acceptance: workspace resolves the two packages)
|
||||
- `tsc --noEmit` exit 0 for **all three** projects (bootstrap + both vendored packages). ✅
|
||||
- `pulumi preview` under the **passphrase** secrets provider (local `file://bootstrap/state` backend
|
||||
+ throwaway `PULUMI_CONFIG_PASSPHRASE` in ENV): exit 0, loads config, **0 real resources** (only the
|
||||
no-op Stack), prints the scaffold outputs. ✅ (acceptance: preview runs on empty/stub stack, passphrase provider)
|
||||
- **Fail-closed demonstrated:** removing `foundation:vm.host` + `foundation:features.backup` made
|
||||
`pulumi preview` exit 1 with one error listing both missing keys; restoring made it pass again. ✅
|
||||
(acceptance: config rejects missing required keys)
|
||||
- **No secrets committed:** `bootstrap/state/` is gitignored (`git check-ignore` confirms); the
|
||||
committed `Pulumi.foundation.yaml` has **no** real `encryptionsalt:`/`secure: v1:` value line
|
||||
(only explanatory comment prose mentions the words); `bun.lock` has no secret leakage. ✅
|
||||
|
||||
**Authored but NOT executed (out of scope — no VM, no `pulumi up` ever):**
|
||||
- Actual Docker-over-SSH provisioning, Vault init/unseal, any container — all LATER tasks (T03+).
|
||||
- The vendored modules' runtime behaviour was not exercised (they are libraries; only typechecked +
|
||||
consumed by the typechecked bootstrap). Their logic is byte-identical to the upstream source apart
|
||||
from the documented type-only re-home in pulumi-vault.
|
||||
|
||||
---
|
||||
|
||||
## 3. CONTRACT_001 ambiguities / decisions
|
||||
|
||||
- **Config key shape (resolved by execution).** CONTRACT_001 §1.1 shows a nested interface but §1.2
|
||||
gives flat dotted example keys (`foundation:hosts.forge`, `foundation:features.forgejo`). Pulumi
|
||||
stores and exposes these **flat** — `getObject("hosts")` does NOT reassemble `hosts.forge`+`hosts.vault`
|
||||
into an object. `loadConfig()` therefore reads each leaf by its full dotted key with the typed
|
||||
accessor for its kind (`get`/`getNumber`/`getBoolean`, and `getObject` for the two arrays), then
|
||||
assembles the nested `FoundationConfig`. This is the idiomatic match for the §1.2 YAML and is robust
|
||||
to Pulumi quoting scalars (`"2222"`, `"true"`). No contract change needed.
|
||||
- **No further ambiguity blocked typing.** Every §1.1 field maps 1:1 to a placeholder key.
|
||||
- **Secrets (§1.3) intentionally not required** by `loadConfig()` — they are seeded by later tasks
|
||||
(T05 Vault capture etc.); requiring them now would block the T02 acceptance (empty/stub stack).
|
||||
|
||||
## 4. Bun-vs-npm decision + rationale
|
||||
|
||||
**Decision: Bun** (Olsitec footgun 16.3 prefers Bun; 000_TOPOLOGY.md §3 specifies Bun workspaces).
|
||||
- Pulumi's nodejs runtime supports `options.packagemanager: bun`; `pulumi preview` ran cleanly under
|
||||
it (the program executes via Pulumi's bundled ts-node against bun-installed deps). **No fallback to
|
||||
npm was needed.**
|
||||
- **One vendoring fix forced by Bun's isolated store:** the upstream modules never declared
|
||||
`@pulumi/pulumi` directly (they relied on it being hoisted into their own `node_modules`). Bun's
|
||||
`.bun/` store layout does not hoist it where standalone `tsc` on a package can find it, so both
|
||||
vendored `package.json`s now list `@pulumi/pulumi` (`^3.138.0`, matching olsitec-core) as an
|
||||
explicit dependency. This is a **packaging-metadata** correction (the import was always real); **no
|
||||
module logic changed**. It also makes the packages correct for Stage-2 publishing. (This is the
|
||||
escalation-worthy "vendoring reveals a dependency" item — judged minor and fixed in place, not a
|
||||
design change.)
|
||||
|
||||
## 5. Recommended follow-ups
|
||||
|
||||
1. **Strip `encryptionsalt` before each commit of `Pulumi.foundation.yaml`.** Every `pulumi
|
||||
preview/up` under the passphrase provider re-appends an `encryptionsalt:` line and re-quotes
|
||||
scalars. The committed file has been left clean; a header comment documents the strip step. Once
|
||||
the first real secret is added (T05), the encryptionsalt becomes load-bearing and SHOULD then be
|
||||
committed alongside the `secure: v1:` values — revisit this guidance at that point.
|
||||
2. **`packages/pulumi-vault` Layer-0 trim (later task).** `VaultBootstrap`/`VaultProject` still carry
|
||||
the Layer-1 minio/garage/cockroach/mongo credential surface. The egg only needs
|
||||
`VaultInitialization` (init/unseal capture) + a minimal `VaultBootstrap`. Trim per 000_TOPOLOGY.md
|
||||
§5.1 "refactor for Layer 0" — out of scope for Stage-1 vendoring.
|
||||
3. **Run `pin-digests`** to replace `PIN_DIGEST` in `VERSIONS` before any real `pulumi up` (T01/preflight concern).
|
||||
4. **Stage-2 publish** (`@olsitec/pulumi-*` to the foundation Forgejo npm registry) once it exists —
|
||||
semantic-release-monorepo + Conventional Commits (000_TOPOLOGY.md §5, memory: olsitec-charts-conventional-commits).
|
||||
5. **Lint config** not vendored — the upstream modules had no per-package eslint file (only an
|
||||
`.editorconfig`, which was copied); olsitec-core's `eslint.config.mjs` is project-level. Add a
|
||||
workspace-level lint setup in a later tooling task if desired.
|
||||
|
||||
## 6. How to reproduce the validation
|
||||
|
||||
```sh
|
||||
cd ~/work/olsitec-foundation/foundation
|
||||
bun install
|
||||
bunx tsc --noEmit -p bootstrap/tsconfig.json
|
||||
bunx tsc --noEmit -p packages/pulumi-docker/tsconfig.json
|
||||
bunx tsc --noEmit -p packages/pulumi-vault/tsconfig.json
|
||||
|
||||
cd bootstrap
|
||||
export PULUMI_HOME="$(pwd)/state/.pulumi-home"
|
||||
export PULUMI_CONFIG_PASSPHRASE='<throwaway-dev-only>' # never commit
|
||||
pulumi login "file://$(pwd)/state"
|
||||
pulumi stack init foundation --secrets-provider=passphrase # first time only
|
||||
pulumi preview --stack foundation
|
||||
# NOTE: preview rewrites Pulumi.foundation.yaml — `git checkout` it or strip the
|
||||
# appended `encryptionsalt:` line before committing. state/ is gitignored.
|
||||
```
|
||||
13
package.json
Normal file
13
package.json
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"name": "@olsitec/foundation",
|
||||
"private": true,
|
||||
"version": "0.0.0",
|
||||
"description": "olsitec-foundation mono-repo — the bootstrap egg (bootstrap/) + vendored shared Pulumi modules (packages/*). One git clone = the full DR unit (000_TOPOLOGY.md, ADR-005).",
|
||||
"workspaces": [
|
||||
"packages/*",
|
||||
"bootstrap"
|
||||
],
|
||||
"devDependencies": {
|
||||
"typescript": "^5.0.0"
|
||||
}
|
||||
}
|
||||
26
packages/pulumi-docker/.editorconfig
Normal file
26
packages/pulumi-docker/.editorconfig
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
# EditorConfig helps developers define and maintain consistent
|
||||
# coding styles between different editors and IDEs
|
||||
# editorconfig.org
|
||||
|
||||
root = true
|
||||
|
||||
|
||||
[*]
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.{diff,md}]
|
||||
trim_trailing_whitespace = false
|
||||
indent_size = 4
|
||||
|
||||
[Makefile]
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
3
packages/pulumi-docker/.gitignore
vendored
Normal file
3
packages/pulumi-docker/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
/bin/
|
||||
/node_modules/
|
||||
*.stack*.json
|
||||
35
packages/pulumi-docker/VENDORED.md
Normal file
35
packages/pulumi-docker/VENDORED.md
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
# VENDORED — `@olsitec/pulumi-docker`
|
||||
|
||||
**Source (absolute path):** `/Users/andiolsi/work/olsicloud4/pulumi/modules/docker/`
|
||||
**Copy date:** 2026-06-30
|
||||
**Stage:** Stage-1 vendoring per [`documentation/000_TOPOLOGY.md` §5](../../documentation/000_TOPOLOGY.md).
|
||||
|
||||
## What this is
|
||||
|
||||
A verbatim copy of the olsicloud4 `modules/docker` Pulumi module (the
|
||||
`DockerDeployments` `@pulumi/docker`-over-SSH wrapper, CONTRACT_003). At day-zero the
|
||||
foundation registry does not yet exist, so `bootstrap/` consumes this module locally
|
||||
through the Bun workspace (`packages/*`) instead of from a registry — this resolves the
|
||||
"registry hosts the modules that build the registry" paradox (000_TOPOLOGY.md §3, ADR-005).
|
||||
|
||||
## What was copied
|
||||
|
||||
`index.ts`, `package.json`, `tsconfig.json`, `.editorconfig`, `.gitignore`.
|
||||
|
||||
**Not copied:** `node_modules/`, `package-lock.json` (lockfiles), `.git/`.
|
||||
|
||||
## Changes made vs. the source
|
||||
|
||||
- `package.json` `name`: `docker` → `@olsitec/pulumi-docker`; added `version` (`0.0.0`,
|
||||
pre-publish placeholder) and `main`/`types` (`index.ts`) so the Bun workspace resolves it.
|
||||
- **No behavioural change.** `index.ts` logic is byte-for-byte the upstream source.
|
||||
|
||||
## Lifecycle (000_TOPOLOGY.md §5)
|
||||
|
||||
- **Stage 1 — VENDOR (this commit):** copied here; consumed locally via Bun workspace.
|
||||
- **Stage 2 — PUBLISH (later task):** once the foundation Forgejo npm registry is live, CI
|
||||
publishes `@olsitec/pulumi-docker@<semver>` (semantic-release-monorepo, Conventional Commits).
|
||||
- **Stage 3 — CONSUME (steady state):** downstream projects switch imports from
|
||||
`olsicloud4/pulumi/modules/docker` to the published package; the old module is frozen then removed.
|
||||
|
||||
Do not refactor the vendored logic here. Behavioural changes belong upstream or in Stage-2+ work.
|
||||
175
packages/pulumi-docker/index.ts
Normal file
175
packages/pulumi-docker/index.ts
Normal file
|
|
@ -0,0 +1,175 @@
|
|||
// index.ts
|
||||
import * as pulumi from "@pulumi/pulumi";
|
||||
import { Output } from "@pulumi/pulumi";
|
||||
import * as docker from "@pulumi/docker";
|
||||
|
||||
export type DockerDeploymentsContainerArgs = {
|
||||
name: string;
|
||||
providerName: string;
|
||||
image: string;
|
||||
ports?: {
|
||||
internal: number;
|
||||
external: number;
|
||||
protocol?: "tcp" | "udp";
|
||||
ip?: string;
|
||||
// hostname?: string;
|
||||
}[];
|
||||
volumes?: {
|
||||
source: string;
|
||||
target: string;
|
||||
readOnly?: boolean;
|
||||
type?: "bind" | "volume" | "tmpfs";
|
||||
}[];
|
||||
networks?: {
|
||||
network: string;
|
||||
aliases?: string[];
|
||||
}[];
|
||||
envs?: (string | Output<string>)[];
|
||||
config: Partial<docker.ContainerArgs>;
|
||||
providerConfig?: Partial<pulumi.CustomResourceOptions>;
|
||||
};
|
||||
interface DockerDeploymentsArgs {
|
||||
provider: Record<
|
||||
string,
|
||||
{
|
||||
host: pulumi.Input<string>;
|
||||
sshPrivateKeyPath?: string;
|
||||
networks?: Record<string, docker.NetworkArgs>;
|
||||
} & Partial<docker.ProviderArgs>
|
||||
>;
|
||||
containers: DockerDeploymentsContainerArgs[];
|
||||
}
|
||||
export class DockerDeployments extends pulumi.ComponentResource {
|
||||
private providers: Record<string, docker.Provider>;
|
||||
public containers: {
|
||||
container: docker.Container;
|
||||
image: Output<docker.GetRegistryImageResult>;
|
||||
volumes?: docker.Volume[];
|
||||
}[];
|
||||
private networks: Record<string, docker.Network>;
|
||||
constructor(
|
||||
name: string,
|
||||
args: DockerDeploymentsArgs,
|
||||
opts?: pulumi.ComponentResourceOptions,
|
||||
) {
|
||||
super("custom:resource:DockerDeployments", name, {}, opts);
|
||||
|
||||
this.providers = Object.entries(args.provider).reduce(
|
||||
(acc, [providerName, providerConfig]) => {
|
||||
acc[providerName] = new docker.Provider(
|
||||
`${name}-${providerName}`,
|
||||
{
|
||||
host: providerConfig.host,
|
||||
sshOpts: providerConfig.sshPrivateKeyPath
|
||||
? [
|
||||
"-o",
|
||||
"StrictHostKeyChecking=no",
|
||||
"-o",
|
||||
"UserKnownHostsFile=/dev/null",
|
||||
"-i",
|
||||
providerConfig.sshPrivateKeyPath,
|
||||
]
|
||||
: undefined,
|
||||
registryAuth: providerConfig.registryAuth,
|
||||
},
|
||||
{
|
||||
parent: this,
|
||||
},
|
||||
);
|
||||
return acc;
|
||||
},
|
||||
{} as Record<string, docker.Provider>,
|
||||
);
|
||||
this.networks = {};
|
||||
Object.entries(args.provider).forEach(([providerName, providerConfig]) => {
|
||||
if (providerConfig.networks) {
|
||||
Object.entries(providerConfig.networks).forEach(
|
||||
([name, networkConfig]) => {
|
||||
this.networks[`${providerName}-${name}`] = new docker.Network(
|
||||
`${providerName}-${name}`,
|
||||
{
|
||||
name: name,
|
||||
attachable: true,
|
||||
driver: "bridge",
|
||||
internal: false,
|
||||
...networkConfig,
|
||||
},
|
||||
{
|
||||
parent: this,
|
||||
provider: this.providers[providerName],
|
||||
deleteBeforeReplace: true,
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
this.containers = [];
|
||||
for (const containerConfig of args.containers) {
|
||||
const provider = this.providers[containerConfig.providerName];
|
||||
const containerImage = pulumi.output(
|
||||
docker.getRegistryImage(
|
||||
{
|
||||
name: containerConfig.image,
|
||||
},
|
||||
{
|
||||
parent: this,
|
||||
provider: provider,
|
||||
},
|
||||
),
|
||||
);
|
||||
|
||||
const container = new docker.Container(
|
||||
`${containerConfig.providerName}-${containerConfig.name}`,
|
||||
{
|
||||
image: containerImage.apply((image) => image.name),
|
||||
name: containerConfig.name,
|
||||
hostname: containerConfig.name,
|
||||
ports: containerConfig.ports?.map((port) => ({
|
||||
internal: port.internal,
|
||||
external: port.external,
|
||||
protocol: port.protocol || "tcp",
|
||||
ip: port.ip,
|
||||
})),
|
||||
mounts: containerConfig.volumes?.map((volume) => ({
|
||||
source: volume.source,
|
||||
target: volume.target,
|
||||
readOnly: volume.readOnly || false,
|
||||
type: volume.type || "volume",
|
||||
})),
|
||||
networksAdvanced: containerConfig.networks?.map((network) => ({
|
||||
name: network.network,
|
||||
aliases: network.aliases || [containerConfig.name],
|
||||
})),
|
||||
envs: containerConfig.envs
|
||||
? [
|
||||
...containerConfig.envs,
|
||||
pulumi.interpolate`IMAGE_ID=${containerImage.apply((image) => image.id)}`,
|
||||
]
|
||||
: [
|
||||
pulumi.interpolate`IMAGE_ID=${containerImage.apply((image) => image.id)}`,
|
||||
],
|
||||
...containerConfig.config,
|
||||
},
|
||||
{
|
||||
parent: this,
|
||||
provider: provider,
|
||||
...containerConfig.providerConfig,
|
||||
ignoreChanges: containerConfig.providerConfig?.ignoreChanges
|
||||
? [...containerConfig.providerConfig.ignoreChanges, "image"]
|
||||
: ["image"],
|
||||
deleteBeforeReplace: true,
|
||||
dependsOn:
|
||||
containerConfig.networks && containerConfig.networks[0].network
|
||||
? [this.networks[containerConfig.networks[0].network]]
|
||||
: [],
|
||||
},
|
||||
);
|
||||
this.containers.push({
|
||||
image: containerImage,
|
||||
container: container,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
18
packages/pulumi-docker/package.json
Normal file
18
packages/pulumi-docker/package.json
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"name": "@olsitec/pulumi-docker",
|
||||
"version": "0.0.0",
|
||||
"main": "index.ts",
|
||||
"types": "index.ts",
|
||||
"devDependencies": {
|
||||
"@eslint/eslintrc": "^3.1.0",
|
||||
"@pulumi/eslint-plugin": "^0.2.0",
|
||||
"@typescript-eslint/eslint-plugin": "^8.13.0",
|
||||
"eslint-config-prettier": "^9.1.0",
|
||||
"prettier": "^3.3.3",
|
||||
"typescript": "^5.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@pulumi/docker": "^4.5.8",
|
||||
"@pulumi/pulumi": "^3.138.0"
|
||||
}
|
||||
}
|
||||
18
packages/pulumi-docker/tsconfig.json
Normal file
18
packages/pulumi-docker/tsconfig.json
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"strict": true,
|
||||
"outDir": "bin",
|
||||
"target": "es2020",
|
||||
"module": "commonjs",
|
||||
"moduleResolution": "node",
|
||||
"sourceMap": true,
|
||||
"experimentalDecorators": true,
|
||||
"pretty": true,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"noImplicitReturns": true,
|
||||
"forceConsistentCasingInFileNames": true
|
||||
},
|
||||
"files": [
|
||||
"index.ts"
|
||||
]
|
||||
}
|
||||
26
packages/pulumi-vault/.editorconfig
Normal file
26
packages/pulumi-vault/.editorconfig
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
# EditorConfig helps developers define and maintain consistent
|
||||
# coding styles between different editors and IDEs
|
||||
# editorconfig.org
|
||||
|
||||
root = true
|
||||
|
||||
|
||||
[*]
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.{diff,md}]
|
||||
trim_trailing_whitespace = false
|
||||
indent_size = 4
|
||||
|
||||
[Makefile]
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
3
packages/pulumi-vault/.gitignore
vendored
Normal file
3
packages/pulumi-vault/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
/bin/
|
||||
/node_modules/
|
||||
*.stack*.json
|
||||
52
packages/pulumi-vault/VENDORED.md
Normal file
52
packages/pulumi-vault/VENDORED.md
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
# VENDORED — `@olsitec/pulumi-vault`
|
||||
|
||||
**Source (absolute path):** `/Users/andiolsi/work/olsicloud4/pulumi/modules/vault/`
|
||||
**Copy date:** 2026-06-30
|
||||
**Stage:** Stage-1 vendoring per [`documentation/000_TOPOLOGY.md` §5](../../documentation/000_TOPOLOGY.md).
|
||||
|
||||
## What this is
|
||||
|
||||
A verbatim copy of the olsicloud4 `modules/vault` Pulumi module — the Vault init/unseal
|
||||
capture (`VaultInitialization`) and the secret-engine/AppRole bootstrap
|
||||
(`VaultBootstrap`, `VaultExternalSecretsClusterAppRole`, `VaultProject`) plus the admin
|
||||
policy (`policy.ts`). Core of the foundation secret layer (ADR-004, PLAN-002 §4). At
|
||||
day-zero `bootstrap/` consumes it locally through the Bun workspace, not from a registry.
|
||||
|
||||
## What was copied
|
||||
|
||||
`index.ts`, `policy.ts`, `package.json`, `tsconfig.json`, `.editorconfig`, `.gitignore`.
|
||||
|
||||
**Not copied:** `node_modules/`, `package-lock.json` (lockfiles), `.git/`.
|
||||
|
||||
## Changes made vs. the source
|
||||
|
||||
- `package.json` `name`: `vault` → `@olsitec/pulumi-vault`; added `version` (`0.0.0`,
|
||||
pre-publish placeholder) and `main`/`types` (`index.ts`) for Bun-workspace resolution.
|
||||
- **Type-only re-home (no logic change):** the upstream `index.ts` imports five
|
||||
*purely type-level* declarations from its sibling module `../../modules/olsitec`
|
||||
(`OlsitecProjectFeatureFlags`, `OlsitecCredentialTypes`, `GitProjectCredentials`,
|
||||
`OciRegistryCredentials`, `MinioBackupProjectCredentials`). That sibling transitively
|
||||
pulls in `modules/minio`, `modules/gitlab`, and `modules/kubernetes`, none of which
|
||||
belong in the foundation egg and none of which are vendored. To keep this package
|
||||
self-contained, those five type declarations were copied **verbatim** into a new local
|
||||
file `olsitec-types.ts`, and the one import line in `index.ts` was re-pointed from
|
||||
`../../modules/olsitec` to `./olsitec-types`. This is the **only** edit to `index.ts`;
|
||||
no runtime/behavioural logic changed.
|
||||
- `tsconfig.json` `files`: added `policy.ts` and `olsitec-types.ts` so the package
|
||||
type-checks standalone (`tsc --noEmit`).
|
||||
|
||||
> **Note (out of scope for T02):** `VaultProject` and `VaultBootstrap` still reference
|
||||
> minio/garage/cockroach/mongo credential shapes inherited from the Layer-1 olsitec module.
|
||||
> The foundation egg only needs `VaultInitialization` (init/unseal capture) + `VaultBootstrap`.
|
||||
> Trimming the unused Layer-1 surface is a deliberate later refactor (000_TOPOLOGY.md §5.1
|
||||
> "refactor for Layer 0"), NOT part of Stage-1 vendoring — Stage 1 preserves the source as-is.
|
||||
|
||||
## Lifecycle (000_TOPOLOGY.md §5)
|
||||
|
||||
- **Stage 1 — VENDOR (this commit):** copied here; consumed locally via Bun workspace.
|
||||
- **Stage 2 — PUBLISH (later task):** CI publishes `@olsitec/pulumi-vault@<semver>` to the
|
||||
foundation Forgejo npm registry once it exists.
|
||||
- **Stage 3 — CONSUME (steady state):** downstream switches imports to the published package;
|
||||
the old module is frozen then removed.
|
||||
|
||||
Do not refactor the vendored logic here beyond the type-only re-home documented above.
|
||||
770
packages/pulumi-vault/index.ts
Normal file
770
packages/pulumi-vault/index.ts
Normal file
|
|
@ -0,0 +1,770 @@
|
|||
// modules/vault/index.ts
|
||||
import * as pulumi from "@pulumi/pulumi";
|
||||
import * as vault from "@pulumi/vault";
|
||||
import { RandomPassword } from "@pulumi/random";
|
||||
|
||||
import { adminPolicyContent } from "./policy";
|
||||
import { Secret } from "@pulumi/vault/generic";
|
||||
|
||||
import {
|
||||
type OlsitecProjectFeatureFlags,
|
||||
type OlsitecCredentialTypes,
|
||||
type GitProjectCredentials,
|
||||
type OciRegistryCredentials,
|
||||
type MinioBackupProjectCredentials,
|
||||
} from "./olsitec-types";
|
||||
|
||||
interface VaultInitializationArgs {
|
||||
url: pulumi.Input<string>;
|
||||
shares: number;
|
||||
threshold: number;
|
||||
}
|
||||
|
||||
interface InitResponse {
|
||||
keys: string[];
|
||||
root_token: string;
|
||||
}
|
||||
|
||||
export class VaultInitialization extends pulumi.ComponentResource {
|
||||
public readonly unsealKeys: pulumi.Output<string[] | undefined>;
|
||||
public readonly rootToken: pulumi.Output<string>;
|
||||
public readonly url: pulumi.Output<string>;
|
||||
|
||||
constructor(
|
||||
name: string,
|
||||
args: VaultInitializationArgs,
|
||||
opts?: pulumi.ComponentResourceOptions,
|
||||
) {
|
||||
super("custom:resource:VaultInitialization", name, {}, opts);
|
||||
|
||||
const config = new pulumi.Config("vaultCredentials"); // Specify a namespace if needed
|
||||
const storedUnsealKeys = config.getSecret("unsealKeys");
|
||||
const storedRootToken = config.getSecret("rootToken");
|
||||
|
||||
this.url = pulumi.output(args.url);
|
||||
|
||||
const initResult = pulumi
|
||||
.all([
|
||||
args.url,
|
||||
pulumi.output(args.shares),
|
||||
pulumi.output(args.threshold),
|
||||
storedUnsealKeys,
|
||||
storedRootToken,
|
||||
])
|
||||
.apply(async ([url, shares, threshold, keys, token]) => {
|
||||
// Check if it's a preview; skip initialization if so
|
||||
if (pulumi.runtime.isDryRun()) {
|
||||
pulumi.log.info("Skipping Vault initialization during preview.");
|
||||
return { keys: [], root_token: "" };
|
||||
}
|
||||
|
||||
// Implement polling to ensure Vault is ready
|
||||
await VaultInitialization.waitForVault(url);
|
||||
|
||||
// Perform the initialization
|
||||
pulumi.log.info(`Attempting to initialize Vault at ${url}/v1/sys/init`);
|
||||
const response = await fetch(`${url}/v1/sys/init`, {
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
Referer: url,
|
||||
"Referrer-Policy": "strict-origin-when-cross-origin",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
secret_shares: shares,
|
||||
secret_threshold: threshold,
|
||||
}),
|
||||
method: "PUT",
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
const errorData = await response.json();
|
||||
const errorMsg = errorData.errors
|
||||
? errorData.errors.join(", ")
|
||||
: response.statusText;
|
||||
|
||||
if (
|
||||
response.status === 400 &&
|
||||
errorMsg.toLowerCase().includes("already initialized")
|
||||
) {
|
||||
if (keys && token) {
|
||||
pulumi.log.info(
|
||||
"Vault is already initialized. Using stored keys and token.",
|
||||
);
|
||||
await this.unsealVault(url, JSON.parse(keys));
|
||||
return {
|
||||
keys: JSON.parse(keys), // Assuming keys are stored as a JSON string
|
||||
root_token: token,
|
||||
};
|
||||
}
|
||||
pulumi.log.info("Vault is already initialized.");
|
||||
return { keys: [], root_token: "" };
|
||||
}
|
||||
|
||||
throw new Error(`Failed to initialize Vault: ${errorMsg}`);
|
||||
}
|
||||
|
||||
const result = (await response.json()) as InitResponse;
|
||||
pulumi.log.info("Vault initialized successfully.");
|
||||
await this.unsealVault(url, result.keys);
|
||||
return {
|
||||
keys: result.keys,
|
||||
root_token: result.root_token,
|
||||
};
|
||||
});
|
||||
|
||||
// Assign the outputs
|
||||
this.unsealKeys = initResult.apply((result) =>
|
||||
pulumi.secret((result.keys as string[]) ?? []),
|
||||
);
|
||||
this.rootToken = initResult.apply((result) =>
|
||||
pulumi.secret(result.root_token),
|
||||
);
|
||||
|
||||
// Register outputs
|
||||
this.registerOutputs({
|
||||
unsealKeys: this.unsealKeys,
|
||||
rootToken: this.rootToken,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Waits until the Vault service is reachable by polling the /v1/sys/init endpoint.
|
||||
* Retries up to 10 times with a 2-second delay between attempts.
|
||||
*/
|
||||
private static async waitForVault(url: string): Promise<void> {
|
||||
const maxRetries = 12;
|
||||
const retryDelay = 10000; // 10 seconds
|
||||
|
||||
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
||||
try {
|
||||
const response = await fetch(`${url}/v1/sys/init`, {
|
||||
method: "GET",
|
||||
});
|
||||
if (response.ok || response.status === 403) {
|
||||
// 403 means Vault is already initialized
|
||||
pulumi.log.info("Vault is reachable and ready.");
|
||||
return;
|
||||
}
|
||||
} catch (error: any) {
|
||||
pulumi.log.info(
|
||||
`Attempt ${attempt}: Failed to reach Vault - ${error.message}`,
|
||||
);
|
||||
// Ignore errors and retry
|
||||
}
|
||||
|
||||
if (attempt < maxRetries) {
|
||||
pulumi.log.info(
|
||||
`Vault not ready, retrying in ${retryDelay / 1000} seconds...`,
|
||||
);
|
||||
await new Promise((res) => setTimeout(res, retryDelay));
|
||||
} else {
|
||||
throw new Error(
|
||||
"Vault service is not reachable after multiple attempts.",
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Unseals the Vault service using the provided unseal keys.
|
||||
*/
|
||||
public async unsealVault(url: string, unsealKeys: string[]): Promise<void> {
|
||||
if (unsealKeys.length === 0) {
|
||||
throw new Error(
|
||||
"Failed to unseal Vault: insufficient unseal keys provided.",
|
||||
);
|
||||
}
|
||||
const sealStatusResponse = await fetch(`${url}/v1/sys/seal-status`, {
|
||||
method: "GET",
|
||||
});
|
||||
const sealStatus = await sealStatusResponse.json();
|
||||
if (!sealStatus.sealed) {
|
||||
pulumi.log.info("Vault is already unsealed.");
|
||||
return;
|
||||
}
|
||||
for (const key of unsealKeys) {
|
||||
const unsealResponse = await fetch(`${url}/v1/sys/unseal`, {
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({ key }),
|
||||
method: "PUT",
|
||||
});
|
||||
if (!unsealResponse.ok) {
|
||||
throw new Error(`Failed to unseal Vault: ${unsealResponse.statusText}`);
|
||||
}
|
||||
const unsealResult = await unsealResponse.json();
|
||||
if (!unsealResult.sealed) {
|
||||
pulumi.log.info("Vault unsealed successfully.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
throw new Error("Failed to unseal Vault.");
|
||||
}
|
||||
}
|
||||
|
||||
interface VaultBootstrapArgs {
|
||||
prefix: string;
|
||||
url: pulumi.Input<string>;
|
||||
token: pulumi.Input<string>;
|
||||
userNames: string[];
|
||||
secrets?: {
|
||||
name: string;
|
||||
path?: string;
|
||||
data: pulumi.Input<{ [key: string]: any }>;
|
||||
disableRead?: boolean;
|
||||
}[];
|
||||
}
|
||||
export class VaultBootstrap extends pulumi.ComponentResource {
|
||||
public readonly url: pulumi.Output<string>;
|
||||
public readonly vaultMount: vault.Mount;
|
||||
public readonly vaultProvider: vault.Provider;
|
||||
public readonly sourceCredentialsPath: pulumi.Output<string>;
|
||||
public readonly path: pulumi.Output<string>;
|
||||
public readonly roleId: pulumi.Output<string>;
|
||||
public readonly secretId: pulumi.Output<string>;
|
||||
public readonly users: {
|
||||
username: string;
|
||||
password: pulumi.Output<string>;
|
||||
}[];
|
||||
private readonly secrets: Secret[];
|
||||
constructor(
|
||||
name: string,
|
||||
args: VaultBootstrapArgs,
|
||||
opts?: pulumi.ComponentResourceOptions,
|
||||
) {
|
||||
super("custom:resource:VaultBootstrap", name, {}, opts);
|
||||
this.users = [];
|
||||
this.url = pulumi.output(args.url);
|
||||
// pulumi.output(args.token).apply((token) => {
|
||||
// console.log("VaultBootstrap: token: ", token);
|
||||
// pulumi.log.info(`VaultBootstrap: token: ${token}`);
|
||||
// });
|
||||
this.vaultProvider = new vault.Provider(
|
||||
`${args.prefix}-vault-provider`,
|
||||
{
|
||||
address: args.url,
|
||||
token: args.token,
|
||||
},
|
||||
{ parent: this },
|
||||
);
|
||||
|
||||
this.vaultMount = new vault.Mount(
|
||||
`${args.prefix}-vault-mount`,
|
||||
{
|
||||
path: args.prefix,
|
||||
type: "kv",
|
||||
options: {
|
||||
version: "2",
|
||||
},
|
||||
},
|
||||
{ provider: this.vaultProvider, parent: this },
|
||||
);
|
||||
this.sourceCredentialsPath = this.vaultMount.path;
|
||||
|
||||
const sourceCredentialsSecret = new vault.generic.Secret(
|
||||
`${args.prefix}-vault-source-credentials`,
|
||||
{
|
||||
path: `${args.prefix}/source-credentials`,
|
||||
dataJson: "{}",
|
||||
disableRead: true,
|
||||
},
|
||||
{
|
||||
provider: this.vaultProvider,
|
||||
parent: this,
|
||||
dependsOn: this.vaultMount,
|
||||
},
|
||||
);
|
||||
|
||||
this.secrets =
|
||||
args.secrets?.map((secret) => {
|
||||
return new vault.generic.Secret(
|
||||
`${args.prefix}-vault-secret-${secret.name}`,
|
||||
{
|
||||
path: secret.path ? secret.path : `${args.prefix}/${secret.name}`,
|
||||
dataJson: pulumi
|
||||
.output(secret.data)
|
||||
.apply((data) => JSON.stringify(data)),
|
||||
disableRead: secret.disableRead,
|
||||
},
|
||||
{
|
||||
provider: this.vaultProvider,
|
||||
parent: this,
|
||||
},
|
||||
);
|
||||
}) || [];
|
||||
|
||||
const pulumiPolicy = new vault.Policy(
|
||||
`${args.prefix}-vault-policy-pulumi`,
|
||||
{
|
||||
name: `pulumi-${args.prefix}-vault-policy-pulumi`,
|
||||
policy: adminPolicyContent,
|
||||
},
|
||||
{ provider: this.vaultProvider, parent: this },
|
||||
);
|
||||
|
||||
const pulumiAuthBackend = new vault.AuthBackend(
|
||||
`${args.prefix}-vault-auth-backend-pulumi`,
|
||||
{
|
||||
type: "approle",
|
||||
path: `pulumi-${args.prefix}-vault-auth-backend-pulumi`,
|
||||
},
|
||||
{
|
||||
provider: this.vaultProvider,
|
||||
parent: this,
|
||||
},
|
||||
);
|
||||
|
||||
const pulumiAuthBackendRole = new vault.approle.AuthBackendRole(
|
||||
`${args.prefix}-vault-auth-backend-role-pulumi`,
|
||||
{
|
||||
backend: pulumiAuthBackend.path,
|
||||
roleName: `pulumi-${args.prefix}-vault-auth-backend-role-pulumi`,
|
||||
tokenPolicies: [pulumiPolicy.name],
|
||||
},
|
||||
{ provider: this.vaultProvider, parent: this },
|
||||
);
|
||||
|
||||
const pulumiSecretId = new vault.approle.AuthBackendRoleSecretID(
|
||||
`${args.prefix}-vault-auth-backend-role-secret-id-pulumi`,
|
||||
{
|
||||
backend: pulumiAuthBackend.path,
|
||||
roleName: pulumiAuthBackendRole.roleName,
|
||||
},
|
||||
{ provider: this.vaultProvider, parent: this },
|
||||
);
|
||||
|
||||
const userpassAuth = new vault.AuthBackend(
|
||||
`${args.prefix}-vault-auth-backend-userpass`,
|
||||
{
|
||||
type: "userpass",
|
||||
path: `userpass`,
|
||||
},
|
||||
{ provider: this.vaultProvider, parent: this },
|
||||
);
|
||||
|
||||
// Create the admin policy
|
||||
const adminPolicy = new vault.Policy(
|
||||
`${args.prefix}-vault-policy-admin`,
|
||||
{
|
||||
name: `pulumi-${args.prefix}-vault-policy-admin`,
|
||||
policy: adminPolicyContent,
|
||||
},
|
||||
{ provider: this.vaultProvider, parent: this, dependsOn: userpassAuth },
|
||||
);
|
||||
// Create the admin user
|
||||
this.users = args.userNames.map((userName) => {
|
||||
const password = new RandomPassword(`${userName}-password`, {
|
||||
length: 22,
|
||||
special: false,
|
||||
}).result;
|
||||
const endpoint = new vault.generic.Endpoint(
|
||||
"admin-user",
|
||||
{
|
||||
path: pulumi.interpolate`auth/${userpassAuth.path}/users/${userName}`,
|
||||
dataJson: pulumi
|
||||
.all({
|
||||
policy: adminPolicy.name,
|
||||
password: password,
|
||||
})
|
||||
.apply((data) => {
|
||||
return JSON.stringify({
|
||||
policies: [data.policy],
|
||||
password: data.password,
|
||||
});
|
||||
}),
|
||||
},
|
||||
{
|
||||
provider: this.vaultProvider,
|
||||
parent: this,
|
||||
},
|
||||
);
|
||||
return { username: userName, password };
|
||||
});
|
||||
|
||||
this.path = pulumiAuthBackend.path;
|
||||
this.roleId = pulumiAuthBackendRole.roleId;
|
||||
this.secretId = pulumiSecretId.secretId;
|
||||
|
||||
this.registerOutputs({
|
||||
path: this.path,
|
||||
roleId: this.roleId,
|
||||
secretId: this.secretId,
|
||||
users: this.users.map((user) => ({
|
||||
username: user.username,
|
||||
password: pulumi.secret(user.password),
|
||||
})),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
interface VaultExternalSecretsClusterAppRoleArgs {
|
||||
// url: pulumi.Input<string>;
|
||||
// token: pulumi.Input<string>;
|
||||
prefix: string;
|
||||
vaultMountId: pulumi.Input<string>;
|
||||
}
|
||||
|
||||
export class VaultExternalSecretsClusterAppRole extends pulumi.ComponentResource {
|
||||
public readonly path: pulumi.Output<string>;
|
||||
public readonly roleId: pulumi.Output<string>;
|
||||
public readonly secretId: pulumi.Output<string>;
|
||||
// public readonly vaultProvider: vault.Provider;
|
||||
public readonly vaultMount: vault.Mount;
|
||||
|
||||
constructor(
|
||||
name: string,
|
||||
args: VaultExternalSecretsClusterAppRoleArgs,
|
||||
opts?: pulumi.ResourceOptions,
|
||||
) {
|
||||
super("custom:resource:VaultExternalSecretsClusterAppRole", name, {}, opts);
|
||||
// this.vaultProvider = new vault.Provider(
|
||||
// `${args.prefix}-vault-provider`,
|
||||
// {
|
||||
// address: args.url,
|
||||
// token: args.token,
|
||||
// },
|
||||
// { parent: this },
|
||||
// );
|
||||
this.vaultMount = vault.Mount.get(
|
||||
`${args.prefix}-vault-mount`,
|
||||
args.vaultMountId,
|
||||
{
|
||||
path: args.prefix,
|
||||
type: "kv",
|
||||
options: {
|
||||
version: "2",
|
||||
},
|
||||
},
|
||||
{
|
||||
// provider: this.vaultProvider,
|
||||
parent: this,
|
||||
},
|
||||
);
|
||||
// Define the policy
|
||||
const paths = {
|
||||
[`${args.prefix}/data`]: '["read", "list"]',
|
||||
[`${args.prefix}/data/*`]: '["read", "list"]',
|
||||
[`${args.prefix}/metadata`]: '["read", "list"]',
|
||||
[`${args.prefix}/metadata/*`]: '["read", "list"]',
|
||||
};
|
||||
|
||||
let policyStatements = "";
|
||||
for (const [path, capabilities] of Object.entries(paths)) {
|
||||
policyStatements += `
|
||||
path "${path}" {
|
||||
capabilities = ${capabilities}
|
||||
}
|
||||
`;
|
||||
}
|
||||
|
||||
const externalSecretsPolicy = new vault.Policy(
|
||||
`${args.prefix}-vault-policy-external-secrets`,
|
||||
{
|
||||
name: `pulumi-${args.prefix}-vault-policy-external-secrets`,
|
||||
policy: policyStatements,
|
||||
},
|
||||
{
|
||||
// provider: this.vaultProvider,
|
||||
parent: this,
|
||||
},
|
||||
);
|
||||
|
||||
const externalSecretsAuthBackend = new vault.AuthBackend(
|
||||
`${args.prefix}-vault-auth-backend-external-secrets`,
|
||||
{
|
||||
type: "approle",
|
||||
path: `pulumi-${args.prefix}-vault-auth-backend-external-secrets`,
|
||||
},
|
||||
{
|
||||
// provider: this.vaultProvider,
|
||||
|
||||
parent: this,
|
||||
},
|
||||
);
|
||||
|
||||
const externalSecretsAuthBackendRole = new vault.approle.AuthBackendRole(
|
||||
`${args.prefix}-vault-auth-backend-role-external-secrets`,
|
||||
{
|
||||
backend: externalSecretsAuthBackend.path,
|
||||
roleName: `pulumi-${args.prefix}-vault-auth-backend-role-external-secrets`,
|
||||
tokenPolicies: [externalSecretsPolicy.name],
|
||||
},
|
||||
{
|
||||
// provider: this.vaultProvider,
|
||||
parent: this,
|
||||
},
|
||||
);
|
||||
|
||||
const externalSecretsSecretId = new vault.approle.AuthBackendRoleSecretID(
|
||||
`${args.prefix}-vault-auth-backend-role-secret-id-external-secrets`,
|
||||
{
|
||||
backend: externalSecretsAuthBackend.path,
|
||||
roleName: externalSecretsAuthBackendRole.roleName,
|
||||
},
|
||||
{
|
||||
// provider: this.vaultProvider,
|
||||
parent: this,
|
||||
},
|
||||
);
|
||||
|
||||
this.path = externalSecretsAuthBackend.path;
|
||||
this.roleId = externalSecretsAuthBackendRole.roleId;
|
||||
this.secretId = externalSecretsSecretId.secretId;
|
||||
|
||||
this.registerOutputs({
|
||||
path: this.path,
|
||||
roleId: this.roleId,
|
||||
secretId: this.secretId,
|
||||
vaultMount: this.vaultMount,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
interface VaultProjectArgs {
|
||||
// vaultProvider: vault.Provider;
|
||||
// vaultMount: vault.Mount;
|
||||
prefix: string;
|
||||
projectName: string;
|
||||
projectStage: string;
|
||||
featureFlags: OlsitecProjectFeatureFlags[];
|
||||
credentials: OlsitecCredentialTypes;
|
||||
gitCredentials: GitProjectCredentials;
|
||||
ociRegistryCredentials: OciRegistryCredentials;
|
||||
minioBackupProjectCredentials?: MinioBackupProjectCredentials;
|
||||
additionalPolicyPaths?: string[];
|
||||
}
|
||||
|
||||
export class VaultProject extends pulumi.ComponentResource {
|
||||
// public readonly vaultProvider: vault.Provider;
|
||||
public readonly path: pulumi.Output<string>;
|
||||
public readonly roleId: pulumi.Output<string>;
|
||||
public readonly secretId: pulumi.Output<string>;
|
||||
|
||||
constructor(
|
||||
name: string,
|
||||
args: VaultProjectArgs,
|
||||
opts?: pulumi.ResourceOptions,
|
||||
) {
|
||||
super("custom:resource:VaultProject", name, {}, opts);
|
||||
// this.vaultProvider = args.vaultProvider;
|
||||
|
||||
// Define the policy
|
||||
let paths = {
|
||||
[`${args.prefix}/data/${args.projectName}/${args.projectStage}`]:
|
||||
'["read", "list"]',
|
||||
[`${args.prefix}/data/${args.projectName}/${args.projectStage}/*`]:
|
||||
'["read", "list"]',
|
||||
[`${args.prefix}/metadata/${args.projectName}/${args.projectStage}`]:
|
||||
'["read", "list"]',
|
||||
[`${args.prefix}/metadata/${args.projectName}/${args.projectStage}/*`]:
|
||||
'["read", "list"]',
|
||||
};
|
||||
|
||||
for (const path of args.additionalPolicyPaths ?? []) {
|
||||
paths = {
|
||||
...paths,
|
||||
[`${args.prefix}/data/${path}`]: '["read", "list"]',
|
||||
[`${args.prefix}/data/${path}/*`]: '["read", "list"]',
|
||||
[`${args.prefix}/metadata/${path}`]: '["read", "list"]',
|
||||
[`${args.prefix}/metadata/${path}/*`]: '["read", "list"]',
|
||||
};
|
||||
}
|
||||
let policyStatements = "";
|
||||
for (const [path, capabilities] of Object.entries(paths)) {
|
||||
policyStatements += `
|
||||
path "${path}" {
|
||||
capabilities = ${capabilities}
|
||||
}
|
||||
`;
|
||||
}
|
||||
|
||||
const externalSecretsPolicy = new vault.Policy(
|
||||
`${name}-vault-policy-external-secrets`,
|
||||
{
|
||||
name: `pulumi-${args.prefix}-${args.projectName}-${args.projectStage}-vault-policy-external-secrets`,
|
||||
policy: policyStatements,
|
||||
},
|
||||
{
|
||||
// provider: this.vaultProvider
|
||||
parent: this,
|
||||
},
|
||||
);
|
||||
|
||||
const externalSecretsAuthBackend = new vault.AuthBackend(
|
||||
`${name}-vault-auth-backend-external-secrets`,
|
||||
{
|
||||
type: "approle",
|
||||
path: `pulumi-${args.prefix}-${args.projectName}-${args.projectStage}-vault-auth-backend-external-secrets`,
|
||||
},
|
||||
{
|
||||
// provider: this.vaultProvider
|
||||
parent: this,
|
||||
},
|
||||
);
|
||||
|
||||
const externalSecretsAuthBackendRole = new vault.approle.AuthBackendRole(
|
||||
`${name}-vault-auth-backend-role`,
|
||||
{
|
||||
backend: externalSecretsAuthBackend.path,
|
||||
roleName: `pulumi-${args.prefix}-${args.projectName}-${args.projectStage}-vault-auth-backend-role`,
|
||||
tokenPolicies: [externalSecretsPolicy.name],
|
||||
},
|
||||
{
|
||||
// provider: this.vaultProvider
|
||||
parent: this,
|
||||
},
|
||||
);
|
||||
|
||||
const externalSecretsAuthBackendRoleSecretId =
|
||||
new vault.approle.AuthBackendRoleSecretID(
|
||||
`${name}-vault-auth-backend-role-secret-id-external-secrets`,
|
||||
{
|
||||
backend: externalSecretsAuthBackend.path,
|
||||
roleName: externalSecretsAuthBackendRole.roleName,
|
||||
},
|
||||
{
|
||||
// provider: this.vaultProvider
|
||||
parent: this,
|
||||
},
|
||||
);
|
||||
|
||||
// minioBackup
|
||||
if (
|
||||
args.featureFlags.includes("minioBackup") &&
|
||||
args.minioBackupProjectCredentials
|
||||
) {
|
||||
const minioBackupCredentialsSecret = new vault.generic.Secret(
|
||||
`${name}-secret-backup-credentials`,
|
||||
{
|
||||
path: `${args.prefix}/${args.projectName}/${args.projectStage}/backup-credentials`,
|
||||
dataJson: pulumi
|
||||
.all({
|
||||
minioBackupAccessKey:
|
||||
args.minioBackupProjectCredentials.minioBackupAccessKey,
|
||||
minioBackupSecretKey:
|
||||
args.minioBackupProjectCredentials.minioBackupSecretKey,
|
||||
minioBackupEndpoint:
|
||||
args.minioBackupProjectCredentials.minioBackupEndpoint,
|
||||
})
|
||||
.apply((data) => JSON.stringify(data)),
|
||||
},
|
||||
{
|
||||
// provider: this.vaultProvider
|
||||
parent: this,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
// project-credentials
|
||||
const projectCredentialsSecret = new vault.generic.Secret(
|
||||
`${name}-secret-project-credentials`,
|
||||
{
|
||||
path: `${args.prefix}/${args.projectName}/${args.projectStage}/project-credentials`,
|
||||
dataJson: "{}",
|
||||
disableRead: true,
|
||||
},
|
||||
{
|
||||
// provider: this.vaultProvider
|
||||
parent: this,
|
||||
},
|
||||
);
|
||||
|
||||
// service-credentials
|
||||
const serviceCredentialsSecret = new vault.generic.Secret(
|
||||
`${name}-secret-service-credentials`,
|
||||
{
|
||||
path: `${args.prefix}/${args.projectName}/${args.projectStage}/service-credentials`,
|
||||
dataJson: pulumi
|
||||
.all({
|
||||
cockroachdbAdminUser: args.credentials.cockroachdbAdminUser,
|
||||
cockroachdbAdminPassword: args.credentials.cockroachdbAdminPassword,
|
||||
cockroachdbServiceUser: args.credentials.cockroachdbServiceUser,
|
||||
cockroachdbServicePassword:
|
||||
args.credentials.cockroachdbServicePassword,
|
||||
mongodbAdminUser: args.credentials.mongodbAdminUser,
|
||||
mongodbAdminPassword: args.credentials.mongodbAdminPassword,
|
||||
mongodbBackupUser: args.credentials.mongodbBackupUser,
|
||||
mongodbBackupPassword: args.credentials.mongodbBackupPassword,
|
||||
mongodbServiceUser: args.credentials.mongodbServiceUser,
|
||||
mongodbServicePassword: args.credentials.mongodbServicePassword,
|
||||
mongodbKeyfile: args.credentials.mongodbKeyfile,
|
||||
minioAdminUser: args.credentials.minioAdminUser,
|
||||
minioAdminPassword: args.credentials.minioAdminPassword,
|
||||
minioServiceUser: args.credentials.minioServiceUser,
|
||||
minioServicePassword: args.credentials.minioServicePassword,
|
||||
rustfsAdminUser: args.credentials.rustfsAdminUser,
|
||||
rustfsAdminPassword: args.credentials.rustfsAdminPassword,
|
||||
rustfsServiceUser: args.credentials.rustfsServiceUser,
|
||||
rustfsServicePassword: args.credentials.rustfsServicePassword,
|
||||
garageRpcSecret: args.credentials.garageRpcSecret,
|
||||
garageAdminToken: args.credentials.garageAdminToken,
|
||||
garageServiceKeyId: args.credentials.garageServiceKeyId,
|
||||
garageServiceKeySecret: args.credentials.garageServiceKeySecret,
|
||||
natsToken: args.credentials.natsToken,
|
||||
grafanaAdminPassword: args.credentials.grafanaAdminPassword,
|
||||
postgresUser: args.credentials.postgresUser,
|
||||
postgresPassword: args.credentials.postgresPassword,
|
||||
postgresServiceUser: args.credentials.postgresServiceUser,
|
||||
postgresServicePassword: args.credentials.postgresServicePassword,
|
||||
basicAuthUser: args.credentials.basicAuthUser,
|
||||
basicAuthPassword: args.credentials.basicAuthPassword,
|
||||
basicAuthHtpasswd: args.credentials.basicAuthHtpasswd,
|
||||
nominatimPassword: args.credentials.nominatimPassword,
|
||||
})
|
||||
.apply((data) => JSON.stringify(data)),
|
||||
},
|
||||
{
|
||||
// provider: this.vaultProvider
|
||||
parent: this,
|
||||
},
|
||||
);
|
||||
|
||||
// git-credentials
|
||||
const gitCredentialsSecret = new vault.generic.Secret(
|
||||
`${name}-secret-git-credentials`,
|
||||
{
|
||||
path: `${args.prefix}/${args.projectName}/${args.projectStage}/git-credentials`,
|
||||
dataJson: pulumi
|
||||
.all({
|
||||
gitArgocdUser: args.gitCredentials.gitArgocdUser,
|
||||
gitArgocdPassword: args.gitCredentials.gitArgocdToken,
|
||||
})
|
||||
.apply((data) => JSON.stringify(data)),
|
||||
},
|
||||
{
|
||||
// provider: this.vaultProvider
|
||||
parent: this,
|
||||
},
|
||||
);
|
||||
|
||||
// registry-credentials
|
||||
const ociRegistryCredentialsSecret = new vault.generic.Secret(
|
||||
`${name}-secret-oci-registry-credentials`,
|
||||
{
|
||||
path: `${args.prefix}/${args.projectName}/${args.projectStage}/registry-credentials`,
|
||||
dataJson: pulumi
|
||||
.all({
|
||||
ociRegistryAddress: args.ociRegistryCredentials.ociRegistryAddress,
|
||||
ociRegistryUser: args.ociRegistryCredentials.ociRegistryUser,
|
||||
ociRegistryPassword:
|
||||
args.ociRegistryCredentials.ociRegistryPassword,
|
||||
})
|
||||
.apply((data) => JSON.stringify(data)),
|
||||
},
|
||||
{
|
||||
// provider: this.vaultProvider
|
||||
parent: this,
|
||||
},
|
||||
);
|
||||
|
||||
this.path = externalSecretsAuthBackend.path;
|
||||
this.roleId = externalSecretsAuthBackendRole.roleId;
|
||||
this.secretId = externalSecretsAuthBackendRoleSecretId.secretId;
|
||||
|
||||
this.registerOutputs({
|
||||
path: this.path,
|
||||
roleId: this.roleId,
|
||||
secretId: this.secretId,
|
||||
});
|
||||
}
|
||||
}
|
||||
90
packages/pulumi-vault/olsitec-types.ts
Normal file
90
packages/pulumi-vault/olsitec-types.ts
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
// olsitec-types.ts
|
||||
//
|
||||
// VENDORING NOTE (Stage-1, 2026-06-30 — see VENDORED.md):
|
||||
// The upstream olsicloud4 `modules/vault/index.ts` imports five PURELY TYPE-LEVEL
|
||||
// declarations from its sibling `../../modules/olsitec`:
|
||||
//
|
||||
// OlsitecProjectFeatureFlags, OlsitecCredentialTypes,
|
||||
// GitProjectCredentials, OciRegistryCredentials, MinioBackupProjectCredentials
|
||||
//
|
||||
// That sibling module transitively pulls in `modules/minio`, `modules/gitlab`,
|
||||
// and `modules/kubernetes`, none of which belong in the foundation egg and none
|
||||
// of which are vendored. To keep the vault module SELF-CONTAINED inside the
|
||||
// foundation workspace WITHOUT changing any runtime behaviour, these five type
|
||||
// declarations are copied here VERBATIM from
|
||||
// `olsicloud4/pulumi/modules/olsitec/index.ts` (definitions only — no logic, no
|
||||
// ComponentResource), and `index.ts`'s import is re-pointed from
|
||||
// `../../modules/olsitec` to `./olsitec-types`.
|
||||
//
|
||||
// This is a type-only re-home; the vault module's logic is unchanged.
|
||||
import * as pulumi from "@pulumi/pulumi";
|
||||
|
||||
export type OlsitecCredentialTypes = {
|
||||
minioBackupEndpoint?: string;
|
||||
minioBackupAccessKey?: pulumi.Output<string>;
|
||||
minioBackupSecretKey?: pulumi.Output<string>;
|
||||
cockroachdbAdminUser?: string;
|
||||
cockroachdbAdminPassword?: pulumi.Output<string>;
|
||||
cockroachdbServiceUser?: string;
|
||||
cockroachdbServicePassword?: pulumi.Output<string>;
|
||||
mongodbAdminUser?: string;
|
||||
mongodbAdminPassword?: pulumi.Output<string>;
|
||||
mongodbBackupUser?: string;
|
||||
mongodbBackupPassword?: pulumi.Output<string>;
|
||||
mongodbServiceUser?: string;
|
||||
mongodbServicePassword?: pulumi.Output<string>;
|
||||
mongodbKeyfile?: pulumi.Output<string>;
|
||||
minioAdminUser?: string;
|
||||
minioAdminPassword?: pulumi.Output<string>;
|
||||
minioServiceUser?: string;
|
||||
minioServicePassword?: pulumi.Output<string>;
|
||||
rustfsAdminUser?: string;
|
||||
rustfsAdminPassword?: pulumi.Output<string>;
|
||||
rustfsServiceUser?: string;
|
||||
rustfsServicePassword?: pulumi.Output<string>;
|
||||
garageRpcSecret?: pulumi.Output<string>;
|
||||
garageAdminToken?: pulumi.Output<string>;
|
||||
garageServiceKeyId?: pulumi.Output<string>;
|
||||
garageServiceKeySecret?: pulumi.Output<string>;
|
||||
natsToken?: pulumi.Output<string>;
|
||||
grafanaAdminPassword?: pulumi.Output<string>;
|
||||
postgresUser?: string;
|
||||
postgresPassword?: pulumi.Output<string>;
|
||||
postgresServiceUser?: string;
|
||||
postgresServicePassword?: pulumi.Output<string>;
|
||||
basicAuthUser?: string;
|
||||
basicAuthPassword?: pulumi.Output<string>;
|
||||
basicAuthHtpasswd?: pulumi.Output<string>;
|
||||
nominatimPassword?: pulumi.Output<string>;
|
||||
};
|
||||
|
||||
export type OlsitecProjectFeatureFlags =
|
||||
| "minioBackup"
|
||||
| "cockroachdb"
|
||||
| "vault"
|
||||
| "mongodb"
|
||||
| "nats"
|
||||
| "minio"
|
||||
| "rustfs"
|
||||
| "garage"
|
||||
| "grafana"
|
||||
| "postgres"
|
||||
| "basicAuth"
|
||||
| "nominatim";
|
||||
|
||||
export type OciRegistryCredentials = {
|
||||
ociRegistryAddress: string;
|
||||
ociRegistryUser: pulumi.Input<string>;
|
||||
ociRegistryPassword: pulumi.Input<string>;
|
||||
};
|
||||
|
||||
export type GitProjectCredentials = {
|
||||
gitArgocdUser: pulumi.Input<string>;
|
||||
gitArgocdToken: pulumi.Input<string>;
|
||||
};
|
||||
|
||||
export type MinioBackupProjectCredentials = {
|
||||
minioBackupEndpoint: pulumi.Input<string>;
|
||||
minioBackupAccessKey: pulumi.Output<string>;
|
||||
minioBackupSecretKey: pulumi.Output<string>;
|
||||
};
|
||||
19
packages/pulumi-vault/package.json
Normal file
19
packages/pulumi-vault/package.json
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"name": "@olsitec/pulumi-vault",
|
||||
"version": "0.0.0",
|
||||
"main": "index.ts",
|
||||
"types": "index.ts",
|
||||
"devDependencies": {
|
||||
"@eslint/eslintrc": "^3.1.0",
|
||||
"@pulumi/eslint-plugin": "^0.2.0",
|
||||
"@typescript-eslint/eslint-plugin": "^8.13.0",
|
||||
"eslint-config-prettier": "^9.1.0",
|
||||
"prettier": "^3.3.3",
|
||||
"typescript": "^5.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@pulumi/pulumi": "^3.138.0",
|
||||
"@pulumi/random": "^4.16.8",
|
||||
"@pulumi/vault": "^4.5.8"
|
||||
}
|
||||
}
|
||||
72
packages/pulumi-vault/policy.ts
Normal file
72
packages/pulumi-vault/policy.ts
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
export const adminPolicyContent = `
|
||||
# Manage auth methods broadly across Vault
|
||||
path "auth/*" {
|
||||
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
|
||||
}
|
||||
|
||||
# Create, update, and delete auth methods
|
||||
path "sys/auth/*" {
|
||||
capabilities = ["create", "update", "delete", "sudo"]
|
||||
}
|
||||
|
||||
# List auth methods
|
||||
path "sys/auth" {
|
||||
capabilities = ["read"]
|
||||
}
|
||||
|
||||
# Create and manage ACL policies
|
||||
path "sys/policies/acl/*" {
|
||||
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
|
||||
}
|
||||
|
||||
# List ACL policies
|
||||
path "sys/policies/acl" {
|
||||
capabilities = ["list"]
|
||||
}
|
||||
|
||||
# Create and manage secrets engines broadly across Vault.
|
||||
path "sys/mounts/*" {
|
||||
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
|
||||
}
|
||||
|
||||
# List enabled secrets engines
|
||||
path "sys/mounts" {
|
||||
capabilities = ["read", "list"]
|
||||
}
|
||||
|
||||
# List, create, update, and delete key/value secrets at secret/
|
||||
path "secret/*" {
|
||||
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
|
||||
}
|
||||
|
||||
# Manage transit secrets engine
|
||||
path "transit/*" {
|
||||
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
|
||||
}
|
||||
|
||||
# Read health checks
|
||||
path "sys/health" {
|
||||
capabilities = ["read", "sudo"]
|
||||
}
|
||||
|
||||
path "*/metadata" {
|
||||
capabilities = ["create", "update", "read", "delete", "list"]
|
||||
}
|
||||
|
||||
path "*/metadata/*" {
|
||||
capabilities = ["create", "update", "read", "delete", "list"]
|
||||
}
|
||||
|
||||
path "*/data" {
|
||||
capabilities = ["create", "update", "read", "delete", "list"]
|
||||
}
|
||||
|
||||
path "*/data/*" {
|
||||
capabilities = ["create", "update", "read", "delete", "list"]
|
||||
}
|
||||
|
||||
path "*" {
|
||||
capabilities = ["create", "update", "read", "delete", "list"]
|
||||
}
|
||||
|
||||
`;
|
||||
20
packages/pulumi-vault/tsconfig.json
Normal file
20
packages/pulumi-vault/tsconfig.json
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"strict": true,
|
||||
"outDir": "bin",
|
||||
"target": "es2020",
|
||||
"module": "commonjs",
|
||||
"moduleResolution": "node",
|
||||
"sourceMap": true,
|
||||
"experimentalDecorators": true,
|
||||
"pretty": true,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"noImplicitReturns": true,
|
||||
"forceConsistentCasingInFileNames": true
|
||||
},
|
||||
"files": [
|
||||
"index.ts",
|
||||
"policy.ts",
|
||||
"olsitec-types.ts"
|
||||
]
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue