dagger-env 0.6.7 → 0.6.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dagger-env.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/op.js.map +1 -1
- package/dist/run-dagger-cmd.js.map +1 -1
- package/package.json +4 -3
- package/src/dagger-env.spec.ts +203 -0
- package/src/dagger-env.ts +227 -0
- package/src/examples/run-dagger-cmd-usage.ts +85 -0
- package/src/index.ts +1 -0
- package/src/op.ts +58 -0
- package/src/run-dagger-cmd.ts +137 -0
package/dist/dagger-env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dagger-env.js","sourceRoot":"","sources":["../src/dagger-env.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dagger-env.js","sourceRoot":"","sources":["../src/dagger-env.ts"],"names":[],"mappings":"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","sourcesContent":["import { dag } from '@dagger.io/dagger'\nimport { z } from 'zod/v4'\n\nimport type { Container, Secret } from '@dagger.io/dagger'\n\n/**\n * Generic configuration for DaggerEnv\n */\nexport type DaggerEnvConfig = {\n\t/** Arguments schema */\n\targs: z.ZodObject<any>\n\t/** Environment variables schema */\n\tenv: z.ZodObject<any>\n\t/** Secrets schema */\n\tsecrets: z.ZodObject<any>\n\t/** Secret presets mapping preset names to arrays of secret names */\n\tsecretPresets: Record<string, readonly string[]>\n\t/** Derived environment variables based on secret names */\n\tderivedEnvVars: Record<string, Record<string, string>>\n}\n\n/**\n * Inferred options type from config\n */\nexport type DaggerOptionsFromConfig<T extends DaggerEnvConfig> = {\n\targs: z.output<T['args']>\n\tenv: z.output<T['env']>\n\tsecrets: z.output<T['secrets']>\n}\n\n/**\n * Reusable Dagger environment abstraction\n */\nexport class DaggerEnv<T extends DaggerEnvConfig> {\n\tprivate readonly optionsSchema: z.ZodObject<{\n\t\targs: T['args']\n\t\tenv: T['env']\n\t\tsecrets: T['secrets']\n\t}>\n\n\tconstructor(private readonly config: T) {\n\t\tthis.optionsSchema = z.object({\n\t\t\targs: config.args,\n\t\t\tenv: config.env,\n\t\t\tsecrets: config.secrets,\n\t\t})\n\t}\n\n\t/**\n\t * Parse dagger options from a Secret\n\t */\n\tasync parseDaggerOptions(options: Secret): Promise<DaggerOptionsFromConfig<T>> {\n\t\treturn this.optionsSchema.parse(\n\t\t\tJSON.parse(await options.plaintext())\n\t\t) as DaggerOptionsFromConfig<T>\n\t}\n\n\t/**\n\t * Create a function that applies environment variables and secrets to a container\n\t * based on the provided Dagger options, secret presets, and additional secret names.\n\t */\n\tasync getWithEnv(\n\t\tdaggerOptions: Secret | DaggerOptionsFromConfig<T>,\n\t\tsecretPresets: Array<Extract<keyof T['secretPresets'], string>>,\n\t\tsecretNames?: Array<Extract<keyof z.output<T['secrets']>, string>>\n\t): Promise<{\n\t\t/**\n\t\t * Apply environment variables and secrets to a container\n\t\t */\n\t\twithEnv: (con: Container) => Container\n\t\t/**\n\t\t * Remove environment variables and secrets from a container\n\t\t */\n\t\twithoutEnv: (con: Container) => Container\n\t}> {\n\t\tconst isSecret = (obj: any): obj is Secret =>\n\t\t\tobj &&\n\t\t\ttypeof obj === 'object' &&\n\t\t\t'id' in obj &&\n\t\t\t'plaintext' in obj &&\n\t\t\ttypeof obj.id === 'function' &&\n\t\t\ttypeof obj.plaintext === 'function'\n\n\t\tconst opts = isSecret(daggerOptions)\n\t\t\t? await this.parseDaggerOptions(daggerOptions)\n\t\t\t: daggerOptions\n\n\t\treturn {\n\t\t\twithEnv: (con: Container) => {\n\t\t\t\tlet c = con\n\n\t\t\t\t// Add individual secret names\n\t\t\t\tfor (const name of secretNames ?? []) {\n\t\t\t\t\tif (typeof name === 'string' && name in opts.secrets) {\n\t\t\t\t\t\tconst secret = (opts.secrets as Record<string, string>)[name]\n\t\t\t\t\t\tif (!secret) {\n\t\t\t\t\t\t\tthrow new Error(`Secret ${name} is undefined`)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tc = c.withSecretVariable(name, dag.setSecret(name, secret))\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst allSecretNames: string[] = [...(secretNames ?? [])]\n\n\t\t\t\t// Add secret presets\n\t\t\t\tfor (const preset of secretPresets) {\n\t\t\t\t\tconst presetSecrets = this.config.secretPresets[preset]\n\t\t\t\t\tif (!presetSecrets) {\n\t\t\t\t\t\tthrow new Error(`Unknown secret preset: ${String(preset)}`)\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const secretName of presetSecrets) {\n\t\t\t\t\t\tconst secret = (opts.secrets as Record<string, string>)[secretName]\n\t\t\t\t\t\tif (!secret) {\n\t\t\t\t\t\t\tthrow new Error(`Secret ${secretName} is undefined`)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tallSecretNames.push(secretName)\n\t\t\t\t\t\tc = c.withSecretVariable(secretName, dag.setSecret(secretName, secret))\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Add derived env vars based on secretNames\n\t\t\t\tfor (const name of allSecretNames) {\n\t\t\t\t\tconst derivedEnvVars = this.config.derivedEnvVars[name]\n\t\t\t\t\tif (derivedEnvVars) {\n\t\t\t\t\t\tfor (const [key, value] of Object.entries(derivedEnvVars)) {\n\t\t\t\t\t\t\tc = c.withEnvVariable(key, value)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Add environment variables from options\n\t\t\t\tconst envVars = opts.env\n\t\t\t\tfor (const [key, value] of Object.entries(envVars)) {\n\t\t\t\t\tif (value !== undefined && typeof value === 'string') {\n\t\t\t\t\t\tc = c.withEnvVariable(key, value)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn c\n\t\t\t},\n\t\t\twithoutEnv: (con: Container) => {\n\t\t\t\tlet c = con\n\n\t\t\t\t// Add individual secret names\n\t\t\t\tfor (const name of secretNames ?? []) {\n\t\t\t\t\tif (typeof name === 'string' && name in opts.secrets) {\n\t\t\t\t\t\tconst secret = (opts.secrets as Record<string, string>)[name]\n\t\t\t\t\t\tif (!secret) {\n\t\t\t\t\t\t\tthrow new Error(`Secret ${name} is undefined`)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tc = c.withoutSecretVariable(name)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst allSecretNames: string[] = [...(secretNames ?? [])]\n\n\t\t\t\t// remove secret presets\n\t\t\t\tfor (const preset of secretPresets) {\n\t\t\t\t\tconst presetSecrets = this.config.secretPresets[preset]\n\t\t\t\t\tif (!presetSecrets) {\n\t\t\t\t\t\tthrow new Error(`Unknown secret preset: ${String(preset)}`)\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const secretName of presetSecrets) {\n\t\t\t\t\t\tconst secret = (opts.secrets as Record<string, string>)[secretName]\n\t\t\t\t\t\tif (!secret) {\n\t\t\t\t\t\t\tthrow new Error(`Secret ${secretName} is undefined`)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tallSecretNames.push(secretName)\n\t\t\t\t\t\tc = c.withoutSecretVariable(secretName)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// remove derived env vars based on secretNames\n\t\t\t\tfor (const name of allSecretNames) {\n\t\t\t\t\tconst derivedEnvVars = this.config.derivedEnvVars[name]\n\t\t\t\t\tif (derivedEnvVars) {\n\t\t\t\t\t\tfor (const key of Object.keys(derivedEnvVars)) {\n\t\t\t\t\t\t\tc = c.withoutEnvVariable(key)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// remove environment variables from options\n\t\t\t\tconst envVars = opts.env\n\t\t\t\tfor (const key of Object.keys(envVars)) {\n\t\t\t\t\tc = c.withoutEnvVariable(key)\n\t\t\t\t}\n\n\t\t\t\treturn c\n\t\t\t},\n\t\t}\n\t}\n\n\t/**\n\t * Get the options schema for this DaggerEnv instance\n\t */\n\tgetOptionsSchema() {\n\t\treturn this.optionsSchema\n\t}\n\n\t/**\n\t * Get available secret presets\n\t */\n\tgetSecretPresets(): Array<keyof T['secretPresets']> {\n\t\treturn Object.keys(this.config.secretPresets)\n\t}\n\n\t/**\n\t * Get secrets for a specific preset\n\t */\n\tgetPresetSecrets(preset: Extract<keyof T['secretPresets'], string>): readonly string[] {\n\t\tconst secrets = this.config.secretPresets[preset]\n\t\tif (!secrets) {\n\t\t\tthrow new Error(`Unknown secret preset: ${String(preset)}`)\n\t\t}\n\t\treturn secrets\n\t}\n}\n\n/**\n * Helper function to create a DaggerEnv instance with proper typing\n */\nexport function createDaggerEnv<T extends DaggerEnvConfig>(config: T): DaggerEnv<T> {\n\treturn new DaggerEnv(config)\n}\n"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA","sourcesContent":["export * from './dagger-env.js'\n"]}
|
package/dist/op.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"op.js","sourceRoot":"","sources":["../src/op.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAA;AAM1B,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAA;AAMF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAA;AAMF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,OAAO,EAAE,SAAS,CAAC,QAAQ,EAAE;IAC7B,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IACnD,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAA;AAMF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,CAAA;AAMjD,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE;IAChB,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;IAC1B,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE;IAC5B,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE;IAC5B,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE;IAClC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;CACxB,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"op.js","sourceRoot":"","sources":["../src/op.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAA;AAM1B,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAA;AAMF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAA;AAMF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,OAAO,EAAE,SAAS,CAAC,QAAQ,EAAE;IAC7B,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IACnD,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAA;AAMF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,CAAA;AAMjD,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE;IAChB,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;IAC1B,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE;IAC5B,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE;IAC5B,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE;IAClC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;CACxB,CAAC,CAAA","sourcesContent":["import { z } from 'zod/v4'\n\n/**\n * 1Password vault information\n */\nexport type OPVault = z.infer<typeof OPVault>\nexport const OPVault = z.object({\n\tid: z.string(),\n\tname: z.string(),\n})\n\n/**\n * 1Password item section information\n */\nexport type OPSection = z.infer<typeof OPSection>\nexport const OPSection = z.object({\n\tid: z.string(),\n\tlabel: z.string().optional(),\n})\n\n/**\n * 1Password item field\n */\nexport type OPField = z.infer<typeof OPField>\nexport const OPField = z.object({\n\tid: z.string(),\n\tsection: OPSection.optional(),\n\ttype: z.enum(['STRING', 'CONCEALED', 'MONTH_YEAR']),\n\tpurpose: z.enum(['NOTES']).optional(),\n\tlabel: z.string(),\n\tvalue: z.string(),\n\treference: z.string(),\n})\n\n/**\n * 1Password item category\n */\nexport type OPCategory = z.infer<typeof OPCategory>\nexport const OPCategory = z.enum(['SECURE_NOTE'])\n\n/**\n * Complete 1Password item structure\n */\nexport type OPItem = z.infer<typeof OPItem>\nexport const OPItem = z.object({\n\tid: z.string(),\n\ttitle: z.string(),\n\tfavorite: z.boolean(),\n\tversion: z.int(),\n\tvault: OPVault,\n\tcategory: OPCategory,\n\tlast_edited_by: z.string(),\n\tcreated_at: z.iso.datetime(),\n\tupdated_at: z.iso.datetime(),\n\tadditional_information: z.string(),\n\tsections: z.array(OPSection),\n\tfields: z.array(OPField),\n})\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-dagger-cmd.js","sourceRoot":"","sources":["../src/run-dagger-cmd.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"run-dagger-cmd.js","sourceRoot":"","sources":["../src/run-dagger-cmd.ts"],"names":[],"mappings":"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","sourcesContent":["import { $, fs } from 'zx'\n\nimport { OPItem, OPSection } from './op.js'\n\nimport type { DaggerEnv, DaggerEnvConfig } from './dagger-env.js'\n\n/**\n * Configuration for running Dagger commands with 1Password integration\n */\nexport interface RunDaggerCommandConfig<T extends DaggerEnvConfig = DaggerEnvConfig> {\n\t/** 1Password vault ID */\n\topVault: string\n\t/** 1Password item ID */\n\topItem: string\n\t/** 1Password sections to include for secrets */\n\topSections: Array<{ label: string; id: string }>\n\t/** Commands that should include Docker socket if available */\n\tdockerCommands?: string[]\n\t/** Hook to run before executing the command (e.g., vendor file setup) */\n\tbeforeCommand?: () => Promise<void>\n\t/** DaggerEnv instance for schema validation and type safety */\n\tdaggerEnv: DaggerEnv<T>\n}\n\n/**\n * Options for individual command execution\n */\nexport interface RunDaggerCommandOptions {\n\t/** Arguments to pass to the Dagger command */\n\targs?: Record<string, any>\n\t/** Additional environment variables */\n\tenv?: Record<string, string>\n\t/** Additional command-line arguments */\n\textraArgs?: string[]\n}\n\n/**\n * Creates a function to run Dagger commands with 1Password integration\n * @param config Configuration for the command runner\n * @returns Function to execute Dagger commands\n */\nexport function createDaggerCommandRunner<T extends DaggerEnvConfig>(\n\tconfig: RunDaggerCommandConfig<T>\n) {\n\tconst opItemUri = `op://${config.opVault}/${config.opItem}`\n\n\treturn async function runDaggerCommand(\n\t\tcommandName: string,\n\t\toptions?: RunDaggerCommandOptions\n\t): Promise<void> {\n\t\tconst { args = {}, env = {}, extraArgs = [] } = options ?? {}\n\n\t\t// Run any pre-command setup\n\t\tif (config.beforeCommand) {\n\t\t\tawait config.beforeCommand()\n\t\t}\n\n\t\t// Environment variables to pass to the `op run` command\n\t\tconst envVars: Record<string, string> = {}\n\n\t\t// Pass dagger cloud token in CI because we don't have user auth\n\t\tif (process.env.CI !== undefined) {\n\t\t\tenvVars.DAGGER_CLOUD_TOKEN = `${opItemUri}/DAGGER_CLOUD_TOKEN`\n\t\t}\n\n\t\tconst commandArgs: string[] = [...extraArgs]\n\n\t\t// Add Docker socket for specific commands if available\n\t\tif (config.dockerCommands?.includes(commandName)) {\n\t\t\ttry {\n\t\t\t\tif (await fs.exists('/var/run/docker.sock')) {\n\t\t\t\t\tcommandArgs.push('--docker-socket=/var/run/docker.sock')\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore if fs is not available or docker socket doesn't exist\n\t\t\t}\n\t\t}\n\n\t\t// Fetch 1Password item\n\t\tconst opItem = OPItem.parse(\n\t\t\tawait $`op item get ${config.opItem} --vault ${config.opVault} --format json`.json()\n\t\t)\n\n\t\t// Parse sections to include\n\t\tconst sectionsToInclude = OPSection.array().parse(config.opSections)\n\n\t\t// Extract secrets from specified sections\n\t\tconst secrets = opItem.fields\n\t\t\t.filter((f) => sectionsToInclude.some((s) => s.id === f.section?.id))\n\t\t\t.reduce(\n\t\t\t\t(acc, f) => {\n\t\t\t\t\tacc[f.label] = f.value\n\t\t\t\t\treturn acc\n\t\t\t\t},\n\t\t\t\t{} as Record<string, string>\n\t\t\t)\n\n\t\t// Build environment variables for Dagger\n\t\tconst daggerEnv: Record<string, string> = { ...env }\n\t\tif (process.env.CI !== undefined) {\n\t\t\tdaggerEnv.CI = process.env.CI\n\t\t}\n\t\tif (process.env.GITHUB_ACTIONS !== undefined) {\n\t\t\tdaggerEnv.GITHUB_ACTIONS = process.env.GITHUB_ACTIONS\n\t\t}\n\n\t\t// Validate and serialize dagger options\n\t\tconst daggerOptions = config.daggerEnv.getOptionsSchema().parse({\n\t\t\targs,\n\t\t\tenv: daggerEnv,\n\t\t\tsecrets,\n\t\t})\n\t\tenvVars.DAGGER_OPTIONS = JSON.stringify(daggerOptions)\n\n\t\t// Construct the command\n\t\tconst cmd: string[] = [\n\t\t\t'op',\n\t\t\t'run',\n\t\t\t'--no-masking',\n\t\t\t'--',\n\t\t\t'dagger',\n\t\t\t'call',\n\t\t\tcommandName,\n\t\t\t...commandArgs,\n\t\t\t'--options=env://DAGGER_OPTIONS',\n\t\t]\n\n\t\t// Execute the command\n\t\tawait $({\n\t\t\tenv: {\n\t\t\t\t...process.env,\n\t\t\t\t...envVars,\n\t\t\t},\n\t\t\tstdio: 'inherit',\n\t\t})`${cmd}`\n\t}\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dagger-env",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.8",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A type-safe, reusable environment configuration abstraction for Dagger modules.",
|
|
6
6
|
"keywords": [
|
|
@@ -44,13 +44,14 @@
|
|
|
44
44
|
"main": "./dist/index.js",
|
|
45
45
|
"module": "./dist/index.js",
|
|
46
46
|
"files": [
|
|
47
|
-
"dist"
|
|
47
|
+
"dist",
|
|
48
|
+
"src"
|
|
48
49
|
],
|
|
49
50
|
"dependencies": {
|
|
50
51
|
"zx": "8.8.4"
|
|
51
52
|
},
|
|
52
53
|
"devDependencies": {
|
|
53
|
-
"@dagger.io/dagger": "0.20.
|
|
54
|
+
"@dagger.io/dagger": "0.20.6",
|
|
54
55
|
"typescript": "5.8.2",
|
|
55
56
|
"vitest": "3.2.4",
|
|
56
57
|
"zod": "4.1.12",
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import { z } from 'zod/v4'
|
|
3
|
+
|
|
4
|
+
import { createDaggerEnv } from './dagger-env'
|
|
5
|
+
|
|
6
|
+
import type { DaggerOptionsFromConfig } from './dagger-env'
|
|
7
|
+
|
|
8
|
+
describe('DaggerEnv', () => {
|
|
9
|
+
const daggerEnv = createDaggerEnv({
|
|
10
|
+
args: z.object({
|
|
11
|
+
push: z.string().optional(),
|
|
12
|
+
environment: z.enum(['dev', 'prod']).optional(),
|
|
13
|
+
}),
|
|
14
|
+
env: z.object({
|
|
15
|
+
CI: z.string().optional(),
|
|
16
|
+
NODE_ENV: z.string().optional(),
|
|
17
|
+
}),
|
|
18
|
+
secrets: z.object({
|
|
19
|
+
API_TOKEN: z.string(),
|
|
20
|
+
DATABASE_URL: z.string(),
|
|
21
|
+
REDIS_URL: z.string(),
|
|
22
|
+
}),
|
|
23
|
+
secretPresets: {
|
|
24
|
+
api: ['API_TOKEN', 'DATABASE_URL'],
|
|
25
|
+
cache: ['REDIS_URL'],
|
|
26
|
+
},
|
|
27
|
+
derivedEnvVars: {
|
|
28
|
+
API_TOKEN: {
|
|
29
|
+
API_BASE_URL: 'https://api.example.com',
|
|
30
|
+
API_VERSION: 'v1',
|
|
31
|
+
},
|
|
32
|
+
DATABASE_URL: {
|
|
33
|
+
DB_POOL_SIZE: '10',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
it('should create a DaggerEnv instance', () => {
|
|
39
|
+
expect(daggerEnv).toBeDefined()
|
|
40
|
+
expect(typeof daggerEnv.parseDaggerOptions).toBe('function')
|
|
41
|
+
expect(typeof daggerEnv.getWithEnv).toBe('function')
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
it('should return the options schema', () => {
|
|
45
|
+
const schema = daggerEnv.getOptionsSchema()
|
|
46
|
+
expect(schema).toBeDefined()
|
|
47
|
+
expect(schema.shape.args).toBeDefined()
|
|
48
|
+
expect(schema.shape.env).toBeDefined()
|
|
49
|
+
expect(schema.shape.secrets).toBeDefined()
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
it('should return available secret presets', () => {
|
|
53
|
+
const presets = daggerEnv.getSecretPresets()
|
|
54
|
+
expect(presets).toEqual(['api', 'cache'])
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
it('should return secrets for a specific preset', () => {
|
|
58
|
+
const apiSecrets = daggerEnv.getPresetSecrets('api')
|
|
59
|
+
expect(apiSecrets).toEqual(['API_TOKEN', 'DATABASE_URL'])
|
|
60
|
+
|
|
61
|
+
const cacheSecrets = daggerEnv.getPresetSecrets('cache')
|
|
62
|
+
expect(cacheSecrets).toEqual(['REDIS_URL'])
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
it('should throw error for unknown preset', () => {
|
|
66
|
+
expect(() => {
|
|
67
|
+
daggerEnv.getPresetSecrets('unknown' as any)
|
|
68
|
+
}).toThrow('Unknown secret preset: unknown')
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
it('should validate options schema', () => {
|
|
72
|
+
const schema = daggerEnv.getOptionsSchema()
|
|
73
|
+
|
|
74
|
+
const validOptions = {
|
|
75
|
+
args: {
|
|
76
|
+
push: 'true',
|
|
77
|
+
environment: 'dev',
|
|
78
|
+
},
|
|
79
|
+
env: {
|
|
80
|
+
CI: 'true',
|
|
81
|
+
NODE_ENV: 'development',
|
|
82
|
+
},
|
|
83
|
+
secrets: {
|
|
84
|
+
API_TOKEN: 'test-token',
|
|
85
|
+
DATABASE_URL: 'postgres://localhost/test',
|
|
86
|
+
REDIS_URL: 'redis://localhost:6379',
|
|
87
|
+
},
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const result = schema.parse(validOptions)
|
|
91
|
+
expect(result).toEqual(validOptions)
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
it('should reject invalid options', () => {
|
|
95
|
+
const schema = daggerEnv.getOptionsSchema()
|
|
96
|
+
|
|
97
|
+
const invalidOptions = {
|
|
98
|
+
args: {
|
|
99
|
+
environment: 'invalid', // not in enum
|
|
100
|
+
},
|
|
101
|
+
env: {
|
|
102
|
+
CI: 'true',
|
|
103
|
+
},
|
|
104
|
+
secrets: {
|
|
105
|
+
// missing required secrets
|
|
106
|
+
},
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
expect(() => schema.parse(invalidOptions)).toThrow()
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
describe('getWithEnv()', () => {
|
|
113
|
+
describe('type inference', () => {
|
|
114
|
+
describe('secretPresets', () => {
|
|
115
|
+
it('should not have type error for valid preset', async () => {
|
|
116
|
+
await daggerEnv.getWithEnv({} as any, ['api'], ['API_TOKEN'])
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
it('should have type error for unknown preset', async () => {
|
|
120
|
+
await daggerEnv.getWithEnv(
|
|
121
|
+
{} as any,
|
|
122
|
+
[
|
|
123
|
+
// @ts-expect-error
|
|
124
|
+
'unknown',
|
|
125
|
+
],
|
|
126
|
+
['API_TOKEN']
|
|
127
|
+
)
|
|
128
|
+
})
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
describe('secretNames', () => {
|
|
132
|
+
it('should not have type error for valid secret name', async () => {
|
|
133
|
+
await daggerEnv.getWithEnv({} as any, ['api'], ['API_TOKEN'])
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
it('should have type error for unknown secret name', async () => {
|
|
137
|
+
await daggerEnv.getWithEnv(
|
|
138
|
+
{} as any,
|
|
139
|
+
['api'],
|
|
140
|
+
[
|
|
141
|
+
// @ts-expect-error
|
|
142
|
+
'INVALID_SECRET',
|
|
143
|
+
]
|
|
144
|
+
)
|
|
145
|
+
})
|
|
146
|
+
})
|
|
147
|
+
})
|
|
148
|
+
})
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
describe('DaggerEnv integration', () => {
|
|
152
|
+
it('should work with a complex configuration', () => {
|
|
153
|
+
const complexConfig = {
|
|
154
|
+
args: z.object({
|
|
155
|
+
push: z.string().optional(),
|
|
156
|
+
filter: z.string().optional(),
|
|
157
|
+
}),
|
|
158
|
+
env: z.object({
|
|
159
|
+
CI: z.string().optional(),
|
|
160
|
+
GITHUB_ACTIONS: z.string().optional(),
|
|
161
|
+
}),
|
|
162
|
+
secrets: z.object({
|
|
163
|
+
BUILD_TOKEN: z.string(),
|
|
164
|
+
CACHE_KEY: z.string(),
|
|
165
|
+
API_TOKEN: z.string(),
|
|
166
|
+
DEPLOY_TOKEN: z.string(),
|
|
167
|
+
}),
|
|
168
|
+
secretPresets: {
|
|
169
|
+
build: ['BUILD_TOKEN', 'CACHE_KEY'],
|
|
170
|
+
deploy: ['API_TOKEN', 'DEPLOY_TOKEN'],
|
|
171
|
+
},
|
|
172
|
+
derivedEnvVars: {
|
|
173
|
+
BUILD_TOKEN: {
|
|
174
|
+
BUILD_API: 'https://build.example.com',
|
|
175
|
+
BUILD_TEAM: 'team_example',
|
|
176
|
+
},
|
|
177
|
+
API_TOKEN: {
|
|
178
|
+
API_ACCOUNT_ID: 'test-account-id',
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
} as const
|
|
182
|
+
|
|
183
|
+
const daggerEnv = createDaggerEnv(complexConfig)
|
|
184
|
+
|
|
185
|
+
expect(daggerEnv.getSecretPresets()).toEqual(['build', 'deploy'])
|
|
186
|
+
expect(daggerEnv.getPresetSecrets('build')).toEqual(['BUILD_TOKEN', 'CACHE_KEY'])
|
|
187
|
+
|
|
188
|
+
const schema = daggerEnv.getOptionsSchema()
|
|
189
|
+
const validOptions = {
|
|
190
|
+
args: { push: 'true', filter: 'api' },
|
|
191
|
+
env: { CI: 'true', GITHUB_ACTIONS: 'true' },
|
|
192
|
+
secrets: {
|
|
193
|
+
BUILD_TOKEN: 'test-build-token',
|
|
194
|
+
CACHE_KEY: 'test-cache-key',
|
|
195
|
+
API_TOKEN: 'test-api-token',
|
|
196
|
+
DEPLOY_TOKEN: 'test-deploy-token',
|
|
197
|
+
},
|
|
198
|
+
} satisfies DaggerOptionsFromConfig<typeof complexConfig>
|
|
199
|
+
|
|
200
|
+
const result = schema.parse(validOptions)
|
|
201
|
+
expect(result).toEqual(validOptions)
|
|
202
|
+
})
|
|
203
|
+
})
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { dag } from '@dagger.io/dagger'
|
|
2
|
+
import { z } from 'zod/v4'
|
|
3
|
+
|
|
4
|
+
import type { Container, Secret } from '@dagger.io/dagger'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Generic configuration for DaggerEnv
|
|
8
|
+
*/
|
|
9
|
+
export type DaggerEnvConfig = {
|
|
10
|
+
/** Arguments schema */
|
|
11
|
+
args: z.ZodObject<any>
|
|
12
|
+
/** Environment variables schema */
|
|
13
|
+
env: z.ZodObject<any>
|
|
14
|
+
/** Secrets schema */
|
|
15
|
+
secrets: z.ZodObject<any>
|
|
16
|
+
/** Secret presets mapping preset names to arrays of secret names */
|
|
17
|
+
secretPresets: Record<string, readonly string[]>
|
|
18
|
+
/** Derived environment variables based on secret names */
|
|
19
|
+
derivedEnvVars: Record<string, Record<string, string>>
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Inferred options type from config
|
|
24
|
+
*/
|
|
25
|
+
export type DaggerOptionsFromConfig<T extends DaggerEnvConfig> = {
|
|
26
|
+
args: z.output<T['args']>
|
|
27
|
+
env: z.output<T['env']>
|
|
28
|
+
secrets: z.output<T['secrets']>
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Reusable Dagger environment abstraction
|
|
33
|
+
*/
|
|
34
|
+
export class DaggerEnv<T extends DaggerEnvConfig> {
|
|
35
|
+
private readonly optionsSchema: z.ZodObject<{
|
|
36
|
+
args: T['args']
|
|
37
|
+
env: T['env']
|
|
38
|
+
secrets: T['secrets']
|
|
39
|
+
}>
|
|
40
|
+
|
|
41
|
+
constructor(private readonly config: T) {
|
|
42
|
+
this.optionsSchema = z.object({
|
|
43
|
+
args: config.args,
|
|
44
|
+
env: config.env,
|
|
45
|
+
secrets: config.secrets,
|
|
46
|
+
})
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Parse dagger options from a Secret
|
|
51
|
+
*/
|
|
52
|
+
async parseDaggerOptions(options: Secret): Promise<DaggerOptionsFromConfig<T>> {
|
|
53
|
+
return this.optionsSchema.parse(
|
|
54
|
+
JSON.parse(await options.plaintext())
|
|
55
|
+
) as DaggerOptionsFromConfig<T>
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Create a function that applies environment variables and secrets to a container
|
|
60
|
+
* based on the provided Dagger options, secret presets, and additional secret names.
|
|
61
|
+
*/
|
|
62
|
+
async getWithEnv(
|
|
63
|
+
daggerOptions: Secret | DaggerOptionsFromConfig<T>,
|
|
64
|
+
secretPresets: Array<Extract<keyof T['secretPresets'], string>>,
|
|
65
|
+
secretNames?: Array<Extract<keyof z.output<T['secrets']>, string>>
|
|
66
|
+
): Promise<{
|
|
67
|
+
/**
|
|
68
|
+
* Apply environment variables and secrets to a container
|
|
69
|
+
*/
|
|
70
|
+
withEnv: (con: Container) => Container
|
|
71
|
+
/**
|
|
72
|
+
* Remove environment variables and secrets from a container
|
|
73
|
+
*/
|
|
74
|
+
withoutEnv: (con: Container) => Container
|
|
75
|
+
}> {
|
|
76
|
+
const isSecret = (obj: any): obj is Secret =>
|
|
77
|
+
obj &&
|
|
78
|
+
typeof obj === 'object' &&
|
|
79
|
+
'id' in obj &&
|
|
80
|
+
'plaintext' in obj &&
|
|
81
|
+
typeof obj.id === 'function' &&
|
|
82
|
+
typeof obj.plaintext === 'function'
|
|
83
|
+
|
|
84
|
+
const opts = isSecret(daggerOptions)
|
|
85
|
+
? await this.parseDaggerOptions(daggerOptions)
|
|
86
|
+
: daggerOptions
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
withEnv: (con: Container) => {
|
|
90
|
+
let c = con
|
|
91
|
+
|
|
92
|
+
// Add individual secret names
|
|
93
|
+
for (const name of secretNames ?? []) {
|
|
94
|
+
if (typeof name === 'string' && name in opts.secrets) {
|
|
95
|
+
const secret = (opts.secrets as Record<string, string>)[name]
|
|
96
|
+
if (!secret) {
|
|
97
|
+
throw new Error(`Secret ${name} is undefined`)
|
|
98
|
+
}
|
|
99
|
+
c = c.withSecretVariable(name, dag.setSecret(name, secret))
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const allSecretNames: string[] = [...(secretNames ?? [])]
|
|
104
|
+
|
|
105
|
+
// Add secret presets
|
|
106
|
+
for (const preset of secretPresets) {
|
|
107
|
+
const presetSecrets = this.config.secretPresets[preset]
|
|
108
|
+
if (!presetSecrets) {
|
|
109
|
+
throw new Error(`Unknown secret preset: ${String(preset)}`)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
for (const secretName of presetSecrets) {
|
|
113
|
+
const secret = (opts.secrets as Record<string, string>)[secretName]
|
|
114
|
+
if (!secret) {
|
|
115
|
+
throw new Error(`Secret ${secretName} is undefined`)
|
|
116
|
+
}
|
|
117
|
+
allSecretNames.push(secretName)
|
|
118
|
+
c = c.withSecretVariable(secretName, dag.setSecret(secretName, secret))
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Add derived env vars based on secretNames
|
|
123
|
+
for (const name of allSecretNames) {
|
|
124
|
+
const derivedEnvVars = this.config.derivedEnvVars[name]
|
|
125
|
+
if (derivedEnvVars) {
|
|
126
|
+
for (const [key, value] of Object.entries(derivedEnvVars)) {
|
|
127
|
+
c = c.withEnvVariable(key, value)
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Add environment variables from options
|
|
133
|
+
const envVars = opts.env
|
|
134
|
+
for (const [key, value] of Object.entries(envVars)) {
|
|
135
|
+
if (value !== undefined && typeof value === 'string') {
|
|
136
|
+
c = c.withEnvVariable(key, value)
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return c
|
|
141
|
+
},
|
|
142
|
+
withoutEnv: (con: Container) => {
|
|
143
|
+
let c = con
|
|
144
|
+
|
|
145
|
+
// Add individual secret names
|
|
146
|
+
for (const name of secretNames ?? []) {
|
|
147
|
+
if (typeof name === 'string' && name in opts.secrets) {
|
|
148
|
+
const secret = (opts.secrets as Record<string, string>)[name]
|
|
149
|
+
if (!secret) {
|
|
150
|
+
throw new Error(`Secret ${name} is undefined`)
|
|
151
|
+
}
|
|
152
|
+
c = c.withoutSecretVariable(name)
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const allSecretNames: string[] = [...(secretNames ?? [])]
|
|
157
|
+
|
|
158
|
+
// remove secret presets
|
|
159
|
+
for (const preset of secretPresets) {
|
|
160
|
+
const presetSecrets = this.config.secretPresets[preset]
|
|
161
|
+
if (!presetSecrets) {
|
|
162
|
+
throw new Error(`Unknown secret preset: ${String(preset)}`)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
for (const secretName of presetSecrets) {
|
|
166
|
+
const secret = (opts.secrets as Record<string, string>)[secretName]
|
|
167
|
+
if (!secret) {
|
|
168
|
+
throw new Error(`Secret ${secretName} is undefined`)
|
|
169
|
+
}
|
|
170
|
+
allSecretNames.push(secretName)
|
|
171
|
+
c = c.withoutSecretVariable(secretName)
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// remove derived env vars based on secretNames
|
|
176
|
+
for (const name of allSecretNames) {
|
|
177
|
+
const derivedEnvVars = this.config.derivedEnvVars[name]
|
|
178
|
+
if (derivedEnvVars) {
|
|
179
|
+
for (const key of Object.keys(derivedEnvVars)) {
|
|
180
|
+
c = c.withoutEnvVariable(key)
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// remove environment variables from options
|
|
186
|
+
const envVars = opts.env
|
|
187
|
+
for (const key of Object.keys(envVars)) {
|
|
188
|
+
c = c.withoutEnvVariable(key)
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return c
|
|
192
|
+
},
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Get the options schema for this DaggerEnv instance
|
|
198
|
+
*/
|
|
199
|
+
getOptionsSchema() {
|
|
200
|
+
return this.optionsSchema
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Get available secret presets
|
|
205
|
+
*/
|
|
206
|
+
getSecretPresets(): Array<keyof T['secretPresets']> {
|
|
207
|
+
return Object.keys(this.config.secretPresets)
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Get secrets for a specific preset
|
|
212
|
+
*/
|
|
213
|
+
getPresetSecrets(preset: Extract<keyof T['secretPresets'], string>): readonly string[] {
|
|
214
|
+
const secrets = this.config.secretPresets[preset]
|
|
215
|
+
if (!secrets) {
|
|
216
|
+
throw new Error(`Unknown secret preset: ${String(preset)}`)
|
|
217
|
+
}
|
|
218
|
+
return secrets
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Helper function to create a DaggerEnv instance with proper typing
|
|
224
|
+
*/
|
|
225
|
+
export function createDaggerEnv<T extends DaggerEnvConfig>(config: T): DaggerEnv<T> {
|
|
226
|
+
return new DaggerEnv(config)
|
|
227
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example usage of the runDaggerCommand abstraction
|
|
3
|
+
*
|
|
4
|
+
* This example shows a realistic configuration for a project that uses Dagger
|
|
5
|
+
* with 1Password integration for secret management.
|
|
6
|
+
*
|
|
7
|
+
* Import pattern:
|
|
8
|
+
* - Main DaggerEnv functionality: import { createDaggerEnv } from 'dagger-env'
|
|
9
|
+
* - Command runner functionality: import { createDaggerCommandRunner } from 'dagger-env/run'
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { createDaggerEnv } from 'dagger-env'
|
|
13
|
+
import { createDaggerCommandRunner } from 'dagger-env/run'
|
|
14
|
+
import { z } from 'zod/v4'
|
|
15
|
+
|
|
16
|
+
// Create a DaggerEnv instance with your project's specific configuration
|
|
17
|
+
const daggerEnv = createDaggerEnv({
|
|
18
|
+
args: z.object({
|
|
19
|
+
environment: z.enum(['dev', 'staging', 'prod']).optional(),
|
|
20
|
+
push: z.boolean().optional(),
|
|
21
|
+
verbose: z.boolean().optional(),
|
|
22
|
+
}),
|
|
23
|
+
env: z.object({
|
|
24
|
+
// CI environment variables
|
|
25
|
+
CI: z.string().optional(),
|
|
26
|
+
GITHUB_ACTIONS: z.string().optional(),
|
|
27
|
+
GITHUB_SHA: z.string().optional(),
|
|
28
|
+
// Project-specific environment variables
|
|
29
|
+
NODE_ENV: z.string().optional(),
|
|
30
|
+
LOG_LEVEL: z.string().optional(),
|
|
31
|
+
}),
|
|
32
|
+
secrets: z.object({
|
|
33
|
+
// API credentials
|
|
34
|
+
API_TOKEN: z.string(),
|
|
35
|
+
API_SECRET: z.string(),
|
|
36
|
+
// Database connection
|
|
37
|
+
DATABASE_URL: z.string(),
|
|
38
|
+
// External service keys
|
|
39
|
+
AWS_ACCESS_KEY_ID: z.string(),
|
|
40
|
+
AWS_SECRET_ACCESS_KEY: z.string(),
|
|
41
|
+
SENTRY_DSN: z.string().optional(),
|
|
42
|
+
}),
|
|
43
|
+
secretPresets: {
|
|
44
|
+
api: ['API_TOKEN', 'API_SECRET'],
|
|
45
|
+
database: ['DATABASE_URL'],
|
|
46
|
+
aws: ['AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY'],
|
|
47
|
+
all: [
|
|
48
|
+
'API_TOKEN',
|
|
49
|
+
'API_SECRET',
|
|
50
|
+
'DATABASE_URL',
|
|
51
|
+
'AWS_ACCESS_KEY_ID',
|
|
52
|
+
'AWS_SECRET_ACCESS_KEY',
|
|
53
|
+
'SENTRY_DSN',
|
|
54
|
+
],
|
|
55
|
+
} as const,
|
|
56
|
+
derivedEnvVars: {} as const,
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
// Create the command runner with 1Password configuration
|
|
60
|
+
export const runDaggerCommand = createDaggerCommandRunner({
|
|
61
|
+
// 1Password configuration
|
|
62
|
+
opVault: 'your-vault-id', // Replace with your actual vault ID
|
|
63
|
+
opItem: 'your-item-id', // Replace with your actual item ID
|
|
64
|
+
opSections: [
|
|
65
|
+
{
|
|
66
|
+
id: 'shared-section-id',
|
|
67
|
+
label: 'Shared',
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: 'production-section-id',
|
|
71
|
+
label: 'Production',
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
// Commands that need Docker socket access
|
|
75
|
+
dockerCommands: ['build', 'test', 'deploy', 'migrate', 'seed'],
|
|
76
|
+
// Optional: Run setup before executing commands
|
|
77
|
+
beforeCommand: async () => {
|
|
78
|
+
// Example: Set up vendor files, download dependencies, etc.
|
|
79
|
+
console.log('Preparing Dagger environment...')
|
|
80
|
+
// const modules = await getDaggerModules()
|
|
81
|
+
// await setupDaggerVendorFiles(modules)
|
|
82
|
+
},
|
|
83
|
+
// Pass the DaggerEnv instance directly
|
|
84
|
+
daggerEnv,
|
|
85
|
+
})
|
package/src/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './dagger-env.js'
|
package/src/op.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { z } from 'zod/v4'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 1Password vault information
|
|
5
|
+
*/
|
|
6
|
+
export type OPVault = z.infer<typeof OPVault>
|
|
7
|
+
export const OPVault = z.object({
|
|
8
|
+
id: z.string(),
|
|
9
|
+
name: z.string(),
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* 1Password item section information
|
|
14
|
+
*/
|
|
15
|
+
export type OPSection = z.infer<typeof OPSection>
|
|
16
|
+
export const OPSection = z.object({
|
|
17
|
+
id: z.string(),
|
|
18
|
+
label: z.string().optional(),
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* 1Password item field
|
|
23
|
+
*/
|
|
24
|
+
export type OPField = z.infer<typeof OPField>
|
|
25
|
+
export const OPField = z.object({
|
|
26
|
+
id: z.string(),
|
|
27
|
+
section: OPSection.optional(),
|
|
28
|
+
type: z.enum(['STRING', 'CONCEALED', 'MONTH_YEAR']),
|
|
29
|
+
purpose: z.enum(['NOTES']).optional(),
|
|
30
|
+
label: z.string(),
|
|
31
|
+
value: z.string(),
|
|
32
|
+
reference: z.string(),
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* 1Password item category
|
|
37
|
+
*/
|
|
38
|
+
export type OPCategory = z.infer<typeof OPCategory>
|
|
39
|
+
export const OPCategory = z.enum(['SECURE_NOTE'])
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Complete 1Password item structure
|
|
43
|
+
*/
|
|
44
|
+
export type OPItem = z.infer<typeof OPItem>
|
|
45
|
+
export const OPItem = z.object({
|
|
46
|
+
id: z.string(),
|
|
47
|
+
title: z.string(),
|
|
48
|
+
favorite: z.boolean(),
|
|
49
|
+
version: z.int(),
|
|
50
|
+
vault: OPVault,
|
|
51
|
+
category: OPCategory,
|
|
52
|
+
last_edited_by: z.string(),
|
|
53
|
+
created_at: z.iso.datetime(),
|
|
54
|
+
updated_at: z.iso.datetime(),
|
|
55
|
+
additional_information: z.string(),
|
|
56
|
+
sections: z.array(OPSection),
|
|
57
|
+
fields: z.array(OPField),
|
|
58
|
+
})
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { $, fs } from 'zx'
|
|
2
|
+
|
|
3
|
+
import { OPItem, OPSection } from './op.js'
|
|
4
|
+
|
|
5
|
+
import type { DaggerEnv, DaggerEnvConfig } from './dagger-env.js'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Configuration for running Dagger commands with 1Password integration
|
|
9
|
+
*/
|
|
10
|
+
export interface RunDaggerCommandConfig<T extends DaggerEnvConfig = DaggerEnvConfig> {
|
|
11
|
+
/** 1Password vault ID */
|
|
12
|
+
opVault: string
|
|
13
|
+
/** 1Password item ID */
|
|
14
|
+
opItem: string
|
|
15
|
+
/** 1Password sections to include for secrets */
|
|
16
|
+
opSections: Array<{ label: string; id: string }>
|
|
17
|
+
/** Commands that should include Docker socket if available */
|
|
18
|
+
dockerCommands?: string[]
|
|
19
|
+
/** Hook to run before executing the command (e.g., vendor file setup) */
|
|
20
|
+
beforeCommand?: () => Promise<void>
|
|
21
|
+
/** DaggerEnv instance for schema validation and type safety */
|
|
22
|
+
daggerEnv: DaggerEnv<T>
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Options for individual command execution
|
|
27
|
+
*/
|
|
28
|
+
export interface RunDaggerCommandOptions {
|
|
29
|
+
/** Arguments to pass to the Dagger command */
|
|
30
|
+
args?: Record<string, any>
|
|
31
|
+
/** Additional environment variables */
|
|
32
|
+
env?: Record<string, string>
|
|
33
|
+
/** Additional command-line arguments */
|
|
34
|
+
extraArgs?: string[]
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Creates a function to run Dagger commands with 1Password integration
|
|
39
|
+
* @param config Configuration for the command runner
|
|
40
|
+
* @returns Function to execute Dagger commands
|
|
41
|
+
*/
|
|
42
|
+
export function createDaggerCommandRunner<T extends DaggerEnvConfig>(
|
|
43
|
+
config: RunDaggerCommandConfig<T>
|
|
44
|
+
) {
|
|
45
|
+
const opItemUri = `op://${config.opVault}/${config.opItem}`
|
|
46
|
+
|
|
47
|
+
return async function runDaggerCommand(
|
|
48
|
+
commandName: string,
|
|
49
|
+
options?: RunDaggerCommandOptions
|
|
50
|
+
): Promise<void> {
|
|
51
|
+
const { args = {}, env = {}, extraArgs = [] } = options ?? {}
|
|
52
|
+
|
|
53
|
+
// Run any pre-command setup
|
|
54
|
+
if (config.beforeCommand) {
|
|
55
|
+
await config.beforeCommand()
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Environment variables to pass to the `op run` command
|
|
59
|
+
const envVars: Record<string, string> = {}
|
|
60
|
+
|
|
61
|
+
// Pass dagger cloud token in CI because we don't have user auth
|
|
62
|
+
if (process.env.CI !== undefined) {
|
|
63
|
+
envVars.DAGGER_CLOUD_TOKEN = `${opItemUri}/DAGGER_CLOUD_TOKEN`
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const commandArgs: string[] = [...extraArgs]
|
|
67
|
+
|
|
68
|
+
// Add Docker socket for specific commands if available
|
|
69
|
+
if (config.dockerCommands?.includes(commandName)) {
|
|
70
|
+
try {
|
|
71
|
+
if (await fs.exists('/var/run/docker.sock')) {
|
|
72
|
+
commandArgs.push('--docker-socket=/var/run/docker.sock')
|
|
73
|
+
}
|
|
74
|
+
} catch {
|
|
75
|
+
// Ignore if fs is not available or docker socket doesn't exist
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Fetch 1Password item
|
|
80
|
+
const opItem = OPItem.parse(
|
|
81
|
+
await $`op item get ${config.opItem} --vault ${config.opVault} --format json`.json()
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
// Parse sections to include
|
|
85
|
+
const sectionsToInclude = OPSection.array().parse(config.opSections)
|
|
86
|
+
|
|
87
|
+
// Extract secrets from specified sections
|
|
88
|
+
const secrets = opItem.fields
|
|
89
|
+
.filter((f) => sectionsToInclude.some((s) => s.id === f.section?.id))
|
|
90
|
+
.reduce(
|
|
91
|
+
(acc, f) => {
|
|
92
|
+
acc[f.label] = f.value
|
|
93
|
+
return acc
|
|
94
|
+
},
|
|
95
|
+
{} as Record<string, string>
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
// Build environment variables for Dagger
|
|
99
|
+
const daggerEnv: Record<string, string> = { ...env }
|
|
100
|
+
if (process.env.CI !== undefined) {
|
|
101
|
+
daggerEnv.CI = process.env.CI
|
|
102
|
+
}
|
|
103
|
+
if (process.env.GITHUB_ACTIONS !== undefined) {
|
|
104
|
+
daggerEnv.GITHUB_ACTIONS = process.env.GITHUB_ACTIONS
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Validate and serialize dagger options
|
|
108
|
+
const daggerOptions = config.daggerEnv.getOptionsSchema().parse({
|
|
109
|
+
args,
|
|
110
|
+
env: daggerEnv,
|
|
111
|
+
secrets,
|
|
112
|
+
})
|
|
113
|
+
envVars.DAGGER_OPTIONS = JSON.stringify(daggerOptions)
|
|
114
|
+
|
|
115
|
+
// Construct the command
|
|
116
|
+
const cmd: string[] = [
|
|
117
|
+
'op',
|
|
118
|
+
'run',
|
|
119
|
+
'--no-masking',
|
|
120
|
+
'--',
|
|
121
|
+
'dagger',
|
|
122
|
+
'call',
|
|
123
|
+
commandName,
|
|
124
|
+
...commandArgs,
|
|
125
|
+
'--options=env://DAGGER_OPTIONS',
|
|
126
|
+
]
|
|
127
|
+
|
|
128
|
+
// Execute the command
|
|
129
|
+
await $({
|
|
130
|
+
env: {
|
|
131
|
+
...process.env,
|
|
132
|
+
...envVars,
|
|
133
|
+
},
|
|
134
|
+
stdio: 'inherit',
|
|
135
|
+
})`${cmd}`
|
|
136
|
+
}
|
|
137
|
+
}
|