@geekmidas/cli 0.29.0 → 0.31.0

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.
Files changed (42) hide show
  1. package/dist/{config-BhryDQEq.cjs → config-BAE9LFC1.cjs} +2 -2
  2. package/dist/{config-BhryDQEq.cjs.map → config-BAE9LFC1.cjs.map} +1 -1
  3. package/dist/{config-C9bdq0l-.mjs → config-BC5n1a2D.mjs} +2 -2
  4. package/dist/{config-C9bdq0l-.mjs.map → config-BC5n1a2D.mjs.map} +1 -1
  5. package/dist/config.cjs +2 -2
  6. package/dist/config.d.cts +1 -1
  7. package/dist/config.d.mts +1 -1
  8. package/dist/config.mjs +2 -2
  9. package/dist/{index-CWN-bgrO.d.mts → index-C7TkoYmt.d.mts} +5 -1
  10. package/dist/index-C7TkoYmt.d.mts.map +1 -0
  11. package/dist/{index-DEWYvYvg.d.cts → index-CpchsC9w.d.cts} +5 -1
  12. package/dist/index-CpchsC9w.d.cts.map +1 -0
  13. package/dist/index.cjs +58 -9
  14. package/dist/index.cjs.map +1 -1
  15. package/dist/index.mjs +58 -9
  16. package/dist/index.mjs.map +1 -1
  17. package/dist/{openapi-BCEFhkLh.mjs → openapi-CjYeF-Tg.mjs} +2 -2
  18. package/dist/{openapi-BCEFhkLh.mjs.map → openapi-CjYeF-Tg.mjs.map} +1 -1
  19. package/dist/{openapi-D82bBqG7.cjs → openapi-a-e3Y8WA.cjs} +2 -2
  20. package/dist/{openapi-D82bBqG7.cjs.map → openapi-a-e3Y8WA.cjs.map} +1 -1
  21. package/dist/openapi.cjs +3 -3
  22. package/dist/openapi.mjs +3 -3
  23. package/dist/workspace/index.cjs +1 -1
  24. package/dist/workspace/index.d.cts +1 -1
  25. package/dist/workspace/index.d.mts +1 -1
  26. package/dist/workspace/index.mjs +1 -1
  27. package/dist/{workspace-DQjmv9lk.mjs → workspace-DFJ3sWfY.mjs} +19 -3
  28. package/dist/{workspace-DQjmv9lk.mjs.map → workspace-DFJ3sWfY.mjs.map} +1 -1
  29. package/dist/{workspace-CiZBOjf9.cjs → workspace-My0A4IRO.cjs} +19 -3
  30. package/dist/{workspace-CiZBOjf9.cjs.map → workspace-My0A4IRO.cjs.map} +1 -1
  31. package/package.json +4 -4
  32. package/src/dev/__tests__/entry.spec.ts +140 -0
  33. package/src/dev/__tests__/index.spec.ts +223 -0
  34. package/src/dev/index.ts +329 -5
  35. package/src/index.ts +30 -16
  36. package/src/init/__tests__/generators.spec.ts +17 -9
  37. package/src/init/versions.ts +1 -1
  38. package/src/workspace/__tests__/schema.spec.ts +114 -0
  39. package/src/workspace/schema.ts +23 -1
  40. package/tsconfig.tsbuildinfo +1 -1
  41. package/dist/index-CWN-bgrO.d.mts.map +0 -1
  42. package/dist/index-DEWYvYvg.d.cts.map +0 -1
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require('./chunk-CUT6urMc.cjs');
2
- const require_workspace = require('./workspace-CiZBOjf9.cjs');
2
+ const require_workspace = require('./workspace-My0A4IRO.cjs');
3
3
  const node_fs = require_chunk.__toESM(require("node:fs"));
4
4
  const node_path = require_chunk.__toESM(require("node:path"));
5
5
 
@@ -222,4 +222,4 @@ Object.defineProperty(exports, 'parseModuleConfig', {
222
222
  return parseModuleConfig;
223
223
  }
224
224
  });
225
- //# sourceMappingURL=config-BhryDQEq.cjs.map
225
+ //# sourceMappingURL=config-BAE9LFC1.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-BhryDQEq.cjs","names":["config: GkmConfig","configString: string","defaultAlias: string","cwd: string"],"sources":["../src/config.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join, parse } from 'node:path';\nimport type { GkmConfig } from './types.js';\nimport {\n\tgetAppGkmConfig,\n\tisWorkspaceConfig,\n\ttype LoadedConfig,\n\ttype NormalizedAppConfig,\n\ttype NormalizedWorkspace,\n\tprocessConfig,\n\ttype WorkspaceConfig,\n} from './workspace/index.js';\n\nexport type { GkmConfig } from './types.js';\nexport type { LoadedConfig, WorkspaceConfig } from './workspace/index.js';\nexport { defineWorkspace } from './workspace/index.js';\n/**\n * Define GKM configuration with full TypeScript support.\n * This is an identity function that provides type safety and autocomplete.\n *\n * @example\n * ```ts\n * // gkm.config.ts\n * import { defineConfig } from '@geekmidas/cli/config';\n *\n * export default defineConfig({\n * routes: './src/endpoints/**\\/*.ts',\n * envParser: './src/config/env',\n * logger: './src/config/logger',\n * telescope: true,\n * });\n * ```\n */\nexport function defineConfig(config: GkmConfig): GkmConfig {\n\treturn config;\n}\n\nexport interface ParsedModuleConfig {\n\tpath: string;\n\timportPattern: string;\n}\n\n/**\n * Parse a module config string into path and import pattern.\n *\n * @param configString - Config string in format \"./path/to/module\" or \"./path/to/module#exportName\"\n * @param defaultAlias - The default alias name to use if no export name specified\n * @returns Object with path and import pattern\n *\n * @example\n * parseModuleConfig('./src/config/env', 'envParser')\n * // { path: './src/config/env', importPattern: 'envParser' }\n *\n * parseModuleConfig('./src/config/env#envParser', 'envParser')\n * // { path: './src/config/env', importPattern: '{ envParser }' }\n *\n * parseModuleConfig('./src/config/env#myEnv', 'envParser')\n * // { path: './src/config/env', importPattern: '{ myEnv as envParser }' }\n */\nexport function parseModuleConfig(\n\tconfigString: string,\n\tdefaultAlias: string,\n): ParsedModuleConfig {\n\tconst parts = configString.split('#');\n\tconst path = parts[0] ?? configString;\n\tconst exportName = parts[1];\n\tconst importPattern = !exportName\n\t\t? defaultAlias\n\t\t: exportName === defaultAlias\n\t\t\t? `{ ${defaultAlias} }`\n\t\t\t: `{ ${exportName} as ${defaultAlias} }`;\n\n\treturn { path, importPattern };\n}\n\nexport interface ConfigDiscoveryResult {\n\tconfigPath: string;\n\tworkspaceRoot: string;\n}\n\n/**\n * Find and return the path to the config file.\n *\n * Resolution order:\n * 1. GKM_CONFIG_PATH env var (set by workspace dev command)\n * 2. Walk up directory tree from cwd\n */\nfunction findConfigPath(cwd: string): ConfigDiscoveryResult {\n\tconst files = ['gkm.config.json', 'gkm.config.ts', 'gkm.config.js'];\n\n\t// Check GKM_CONFIG_PATH env var first (set by workspace dev command)\n\tconst envConfigPath = process.env.GKM_CONFIG_PATH;\n\tif (envConfigPath && existsSync(envConfigPath)) {\n\t\treturn {\n\t\t\tconfigPath: envConfigPath,\n\t\t\tworkspaceRoot: dirname(envConfigPath),\n\t\t};\n\t}\n\n\t// Walk up directory tree to find config\n\tlet currentDir = cwd;\n\tconst { root } = parse(currentDir);\n\n\twhile (currentDir !== root) {\n\t\tfor (const file of files) {\n\t\t\tconst configPath = join(currentDir, file);\n\t\t\tif (existsSync(configPath)) {\n\t\t\t\treturn {\n\t\t\t\t\tconfigPath,\n\t\t\t\t\tworkspaceRoot: currentDir,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tcurrentDir = dirname(currentDir);\n\t}\n\n\tthrow new Error(\n\t\t'Configuration file not found. Please create gkm.config.json, gkm.config.ts, or gkm.config.js in the project root.',\n\t);\n}\n\n/**\n * Get app name from package.json in the given directory.\n * Handles scoped packages by extracting the name after the scope.\n *\n * @example\n * getAppNameFromCwd('/path/to/apps/api')\n * // package.json: { \"name\": \"@myorg/api\" }\n * // Returns: 'api'\n */\nexport function getAppNameFromCwd(cwd: string = process.cwd()): string | null {\n\tconst packageJsonPath = join(cwd, 'package.json');\n\n\tif (!existsSync(packageJsonPath)) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\t\tconst name = packageJson.name as string | undefined;\n\n\t\tif (!name) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Handle scoped packages: @scope/name -> name\n\t\tif (name.startsWith('@') && name.includes('/')) {\n\t\t\treturn name.split('/')[1] ?? null;\n\t\t}\n\n\t\treturn name;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\ninterface RawConfigResult {\n\tconfig: GkmConfig | WorkspaceConfig;\n\tworkspaceRoot: string;\n}\n\n/**\n * Load raw configuration from file.\n */\nasync function loadRawConfig(cwd: string): Promise<RawConfigResult> {\n\tconst { configPath, workspaceRoot } = findConfigPath(cwd);\n\n\ttry {\n\t\tconst config = await import(configPath);\n\t\treturn {\n\t\t\tconfig: config.default,\n\t\t\tworkspaceRoot,\n\t\t};\n\t} catch (error) {\n\t\tthrow new Error(`Failed to load config: ${(error as Error).message}`);\n\t}\n}\n\n/**\n * Load configuration file (single-app format).\n * For backwards compatibility with existing code.\n *\n * @deprecated Use loadWorkspaceConfig for new code\n */\nexport async function loadConfig(\n\tcwd: string = process.cwd(),\n): Promise<GkmConfig> {\n\tconst { config } = await loadRawConfig(cwd);\n\n\t// If it's a workspace config, throw an error\n\tif (isWorkspaceConfig(config)) {\n\t\tthrow new Error(\n\t\t\t'Workspace configuration detected. Use loadWorkspaceConfig() instead.',\n\t\t);\n\t}\n\n\treturn config;\n}\n\n/**\n * Load configuration file and process it as a workspace.\n * Works with both single-app and workspace configurations.\n *\n * Single-app configs are automatically wrapped as a workspace with one app.\n *\n * @example\n * ```ts\n * const { type, workspace } = await loadWorkspaceConfig();\n *\n * if (type === 'workspace') {\n * console.log('Multi-app workspace:', workspace.apps);\n * } else {\n * console.log('Single app wrapped as workspace');\n * }\n * ```\n */\nexport async function loadWorkspaceConfig(\n\tcwd: string = process.cwd(),\n): Promise<LoadedConfig> {\n\tconst { config, workspaceRoot } = await loadRawConfig(cwd);\n\treturn processConfig(config, workspaceRoot);\n}\n\nexport interface AppConfigResult {\n\tappName: string;\n\tapp: NormalizedAppConfig;\n\tgkmConfig: GkmConfig;\n\tworkspace: NormalizedWorkspace;\n\tworkspaceRoot: string;\n\tappRoot: string;\n}\n\n/**\n * Load app-specific configuration from workspace.\n * Uses the app name from package.json to find the correct app config.\n *\n * @example\n * ```ts\n * // From apps/api directory with package.json: { \"name\": \"@myorg/api\" }\n * const { app, workspace, workspaceRoot } = await loadAppConfig();\n * console.log(app.routes); // './src/endpoints/**\\/*.ts'\n * ```\n */\nexport async function loadAppConfig(\n\tcwd: string = process.cwd(),\n): Promise<AppConfigResult> {\n\tconst appName = getAppNameFromCwd(cwd);\n\n\tif (!appName) {\n\t\tthrow new Error(\n\t\t\t'Could not determine app name. Ensure package.json exists with a \"name\" field.',\n\t\t);\n\t}\n\n\tconst { config, workspaceRoot } = await loadRawConfig(cwd);\n\tconst loadedConfig = processConfig(config, workspaceRoot);\n\n\t// Find the app in workspace (apps is a Record<string, NormalizedAppConfig>)\n\tconst app = loadedConfig.workspace.apps[appName];\n\n\tif (!app) {\n\t\tconst availableApps = Object.keys(loadedConfig.workspace.apps).join(', ');\n\t\tthrow new Error(\n\t\t\t`App \"${appName}\" not found in workspace config. Available apps: ${availableApps}. ` +\n\t\t\t\t`Ensure the package.json name matches the app key in gkm.config.ts.`,\n\t\t);\n\t}\n\n\t// Get the app's GKM config using the helper\n\tconst gkmConfig = getAppGkmConfig(loadedConfig.workspace, appName);\n\n\tif (!gkmConfig) {\n\t\tthrow new Error(\n\t\t\t`App \"${appName}\" is not a backend app and cannot be run with gkm dev.`,\n\t\t);\n\t}\n\n\treturn {\n\t\tappName,\n\t\tapp,\n\t\tgkmConfig,\n\t\tworkspace: loadedConfig.workspace,\n\t\tworkspaceRoot,\n\t\tappRoot: join(workspaceRoot, app.path),\n\t};\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"config-BAE9LFC1.cjs","names":["config: GkmConfig","configString: string","defaultAlias: string","cwd: string"],"sources":["../src/config.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join, parse } from 'node:path';\nimport type { GkmConfig } from './types.js';\nimport {\n\tgetAppGkmConfig,\n\tisWorkspaceConfig,\n\ttype LoadedConfig,\n\ttype NormalizedAppConfig,\n\ttype NormalizedWorkspace,\n\tprocessConfig,\n\ttype WorkspaceConfig,\n} from './workspace/index.js';\n\nexport type { GkmConfig } from './types.js';\nexport type { LoadedConfig, WorkspaceConfig } from './workspace/index.js';\nexport { defineWorkspace } from './workspace/index.js';\n/**\n * Define GKM configuration with full TypeScript support.\n * This is an identity function that provides type safety and autocomplete.\n *\n * @example\n * ```ts\n * // gkm.config.ts\n * import { defineConfig } from '@geekmidas/cli/config';\n *\n * export default defineConfig({\n * routes: './src/endpoints/**\\/*.ts',\n * envParser: './src/config/env',\n * logger: './src/config/logger',\n * telescope: true,\n * });\n * ```\n */\nexport function defineConfig(config: GkmConfig): GkmConfig {\n\treturn config;\n}\n\nexport interface ParsedModuleConfig {\n\tpath: string;\n\timportPattern: string;\n}\n\n/**\n * Parse a module config string into path and import pattern.\n *\n * @param configString - Config string in format \"./path/to/module\" or \"./path/to/module#exportName\"\n * @param defaultAlias - The default alias name to use if no export name specified\n * @returns Object with path and import pattern\n *\n * @example\n * parseModuleConfig('./src/config/env', 'envParser')\n * // { path: './src/config/env', importPattern: 'envParser' }\n *\n * parseModuleConfig('./src/config/env#envParser', 'envParser')\n * // { path: './src/config/env', importPattern: '{ envParser }' }\n *\n * parseModuleConfig('./src/config/env#myEnv', 'envParser')\n * // { path: './src/config/env', importPattern: '{ myEnv as envParser }' }\n */\nexport function parseModuleConfig(\n\tconfigString: string,\n\tdefaultAlias: string,\n): ParsedModuleConfig {\n\tconst parts = configString.split('#');\n\tconst path = parts[0] ?? configString;\n\tconst exportName = parts[1];\n\tconst importPattern = !exportName\n\t\t? defaultAlias\n\t\t: exportName === defaultAlias\n\t\t\t? `{ ${defaultAlias} }`\n\t\t\t: `{ ${exportName} as ${defaultAlias} }`;\n\n\treturn { path, importPattern };\n}\n\nexport interface ConfigDiscoveryResult {\n\tconfigPath: string;\n\tworkspaceRoot: string;\n}\n\n/**\n * Find and return the path to the config file.\n *\n * Resolution order:\n * 1. GKM_CONFIG_PATH env var (set by workspace dev command)\n * 2. Walk up directory tree from cwd\n */\nfunction findConfigPath(cwd: string): ConfigDiscoveryResult {\n\tconst files = ['gkm.config.json', 'gkm.config.ts', 'gkm.config.js'];\n\n\t// Check GKM_CONFIG_PATH env var first (set by workspace dev command)\n\tconst envConfigPath = process.env.GKM_CONFIG_PATH;\n\tif (envConfigPath && existsSync(envConfigPath)) {\n\t\treturn {\n\t\t\tconfigPath: envConfigPath,\n\t\t\tworkspaceRoot: dirname(envConfigPath),\n\t\t};\n\t}\n\n\t// Walk up directory tree to find config\n\tlet currentDir = cwd;\n\tconst { root } = parse(currentDir);\n\n\twhile (currentDir !== root) {\n\t\tfor (const file of files) {\n\t\t\tconst configPath = join(currentDir, file);\n\t\t\tif (existsSync(configPath)) {\n\t\t\t\treturn {\n\t\t\t\t\tconfigPath,\n\t\t\t\t\tworkspaceRoot: currentDir,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tcurrentDir = dirname(currentDir);\n\t}\n\n\tthrow new Error(\n\t\t'Configuration file not found. Please create gkm.config.json, gkm.config.ts, or gkm.config.js in the project root.',\n\t);\n}\n\n/**\n * Get app name from package.json in the given directory.\n * Handles scoped packages by extracting the name after the scope.\n *\n * @example\n * getAppNameFromCwd('/path/to/apps/api')\n * // package.json: { \"name\": \"@myorg/api\" }\n * // Returns: 'api'\n */\nexport function getAppNameFromCwd(cwd: string = process.cwd()): string | null {\n\tconst packageJsonPath = join(cwd, 'package.json');\n\n\tif (!existsSync(packageJsonPath)) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\t\tconst name = packageJson.name as string | undefined;\n\n\t\tif (!name) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Handle scoped packages: @scope/name -> name\n\t\tif (name.startsWith('@') && name.includes('/')) {\n\t\t\treturn name.split('/')[1] ?? null;\n\t\t}\n\n\t\treturn name;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\ninterface RawConfigResult {\n\tconfig: GkmConfig | WorkspaceConfig;\n\tworkspaceRoot: string;\n}\n\n/**\n * Load raw configuration from file.\n */\nasync function loadRawConfig(cwd: string): Promise<RawConfigResult> {\n\tconst { configPath, workspaceRoot } = findConfigPath(cwd);\n\n\ttry {\n\t\tconst config = await import(configPath);\n\t\treturn {\n\t\t\tconfig: config.default,\n\t\t\tworkspaceRoot,\n\t\t};\n\t} catch (error) {\n\t\tthrow new Error(`Failed to load config: ${(error as Error).message}`);\n\t}\n}\n\n/**\n * Load configuration file (single-app format).\n * For backwards compatibility with existing code.\n *\n * @deprecated Use loadWorkspaceConfig for new code\n */\nexport async function loadConfig(\n\tcwd: string = process.cwd(),\n): Promise<GkmConfig> {\n\tconst { config } = await loadRawConfig(cwd);\n\n\t// If it's a workspace config, throw an error\n\tif (isWorkspaceConfig(config)) {\n\t\tthrow new Error(\n\t\t\t'Workspace configuration detected. Use loadWorkspaceConfig() instead.',\n\t\t);\n\t}\n\n\treturn config;\n}\n\n/**\n * Load configuration file and process it as a workspace.\n * Works with both single-app and workspace configurations.\n *\n * Single-app configs are automatically wrapped as a workspace with one app.\n *\n * @example\n * ```ts\n * const { type, workspace } = await loadWorkspaceConfig();\n *\n * if (type === 'workspace') {\n * console.log('Multi-app workspace:', workspace.apps);\n * } else {\n * console.log('Single app wrapped as workspace');\n * }\n * ```\n */\nexport async function loadWorkspaceConfig(\n\tcwd: string = process.cwd(),\n): Promise<LoadedConfig> {\n\tconst { config, workspaceRoot } = await loadRawConfig(cwd);\n\treturn processConfig(config, workspaceRoot);\n}\n\nexport interface AppConfigResult {\n\tappName: string;\n\tapp: NormalizedAppConfig;\n\tgkmConfig: GkmConfig;\n\tworkspace: NormalizedWorkspace;\n\tworkspaceRoot: string;\n\tappRoot: string;\n}\n\n/**\n * Load app-specific configuration from workspace.\n * Uses the app name from package.json to find the correct app config.\n *\n * @example\n * ```ts\n * // From apps/api directory with package.json: { \"name\": \"@myorg/api\" }\n * const { app, workspace, workspaceRoot } = await loadAppConfig();\n * console.log(app.routes); // './src/endpoints/**\\/*.ts'\n * ```\n */\nexport async function loadAppConfig(\n\tcwd: string = process.cwd(),\n): Promise<AppConfigResult> {\n\tconst appName = getAppNameFromCwd(cwd);\n\n\tif (!appName) {\n\t\tthrow new Error(\n\t\t\t'Could not determine app name. Ensure package.json exists with a \"name\" field.',\n\t\t);\n\t}\n\n\tconst { config, workspaceRoot } = await loadRawConfig(cwd);\n\tconst loadedConfig = processConfig(config, workspaceRoot);\n\n\t// Find the app in workspace (apps is a Record<string, NormalizedAppConfig>)\n\tconst app = loadedConfig.workspace.apps[appName];\n\n\tif (!app) {\n\t\tconst availableApps = Object.keys(loadedConfig.workspace.apps).join(', ');\n\t\tthrow new Error(\n\t\t\t`App \"${appName}\" not found in workspace config. Available apps: ${availableApps}. ` +\n\t\t\t\t`Ensure the package.json name matches the app key in gkm.config.ts.`,\n\t\t);\n\t}\n\n\t// Get the app's GKM config using the helper\n\tconst gkmConfig = getAppGkmConfig(loadedConfig.workspace, appName);\n\n\tif (!gkmConfig) {\n\t\tthrow new Error(\n\t\t\t`App \"${appName}\" is not a backend app and cannot be run with gkm dev.`,\n\t\t);\n\t}\n\n\treturn {\n\t\tappName,\n\t\tapp,\n\t\tgkmConfig,\n\t\tworkspace: loadedConfig.workspace,\n\t\tworkspaceRoot,\n\t\tappRoot: join(workspaceRoot, app.path),\n\t};\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { getAppGkmConfig, isWorkspaceConfig, processConfig } from "./workspace-DQjmv9lk.mjs";
1
+ import { getAppGkmConfig, isWorkspaceConfig, processConfig } from "./workspace-DFJ3sWfY.mjs";
2
2
  import { existsSync, readFileSync } from "node:fs";
3
3
  import { dirname, join, parse } from "node:path";
4
4
 
@@ -186,4 +186,4 @@ async function loadAppConfig(cwd = process.cwd()) {
186
186
 
187
187
  //#endregion
188
188
  export { defineConfig, getAppNameFromCwd, loadAppConfig, loadConfig, loadWorkspaceConfig, parseModuleConfig };
189
- //# sourceMappingURL=config-C9bdq0l-.mjs.map
189
+ //# sourceMappingURL=config-BC5n1a2D.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-C9bdq0l-.mjs","names":["config: GkmConfig","configString: string","defaultAlias: string","cwd: string"],"sources":["../src/config.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join, parse } from 'node:path';\nimport type { GkmConfig } from './types.js';\nimport {\n\tgetAppGkmConfig,\n\tisWorkspaceConfig,\n\ttype LoadedConfig,\n\ttype NormalizedAppConfig,\n\ttype NormalizedWorkspace,\n\tprocessConfig,\n\ttype WorkspaceConfig,\n} from './workspace/index.js';\n\nexport type { GkmConfig } from './types.js';\nexport type { LoadedConfig, WorkspaceConfig } from './workspace/index.js';\nexport { defineWorkspace } from './workspace/index.js';\n/**\n * Define GKM configuration with full TypeScript support.\n * This is an identity function that provides type safety and autocomplete.\n *\n * @example\n * ```ts\n * // gkm.config.ts\n * import { defineConfig } from '@geekmidas/cli/config';\n *\n * export default defineConfig({\n * routes: './src/endpoints/**\\/*.ts',\n * envParser: './src/config/env',\n * logger: './src/config/logger',\n * telescope: true,\n * });\n * ```\n */\nexport function defineConfig(config: GkmConfig): GkmConfig {\n\treturn config;\n}\n\nexport interface ParsedModuleConfig {\n\tpath: string;\n\timportPattern: string;\n}\n\n/**\n * Parse a module config string into path and import pattern.\n *\n * @param configString - Config string in format \"./path/to/module\" or \"./path/to/module#exportName\"\n * @param defaultAlias - The default alias name to use if no export name specified\n * @returns Object with path and import pattern\n *\n * @example\n * parseModuleConfig('./src/config/env', 'envParser')\n * // { path: './src/config/env', importPattern: 'envParser' }\n *\n * parseModuleConfig('./src/config/env#envParser', 'envParser')\n * // { path: './src/config/env', importPattern: '{ envParser }' }\n *\n * parseModuleConfig('./src/config/env#myEnv', 'envParser')\n * // { path: './src/config/env', importPattern: '{ myEnv as envParser }' }\n */\nexport function parseModuleConfig(\n\tconfigString: string,\n\tdefaultAlias: string,\n): ParsedModuleConfig {\n\tconst parts = configString.split('#');\n\tconst path = parts[0] ?? configString;\n\tconst exportName = parts[1];\n\tconst importPattern = !exportName\n\t\t? defaultAlias\n\t\t: exportName === defaultAlias\n\t\t\t? `{ ${defaultAlias} }`\n\t\t\t: `{ ${exportName} as ${defaultAlias} }`;\n\n\treturn { path, importPattern };\n}\n\nexport interface ConfigDiscoveryResult {\n\tconfigPath: string;\n\tworkspaceRoot: string;\n}\n\n/**\n * Find and return the path to the config file.\n *\n * Resolution order:\n * 1. GKM_CONFIG_PATH env var (set by workspace dev command)\n * 2. Walk up directory tree from cwd\n */\nfunction findConfigPath(cwd: string): ConfigDiscoveryResult {\n\tconst files = ['gkm.config.json', 'gkm.config.ts', 'gkm.config.js'];\n\n\t// Check GKM_CONFIG_PATH env var first (set by workspace dev command)\n\tconst envConfigPath = process.env.GKM_CONFIG_PATH;\n\tif (envConfigPath && existsSync(envConfigPath)) {\n\t\treturn {\n\t\t\tconfigPath: envConfigPath,\n\t\t\tworkspaceRoot: dirname(envConfigPath),\n\t\t};\n\t}\n\n\t// Walk up directory tree to find config\n\tlet currentDir = cwd;\n\tconst { root } = parse(currentDir);\n\n\twhile (currentDir !== root) {\n\t\tfor (const file of files) {\n\t\t\tconst configPath = join(currentDir, file);\n\t\t\tif (existsSync(configPath)) {\n\t\t\t\treturn {\n\t\t\t\t\tconfigPath,\n\t\t\t\t\tworkspaceRoot: currentDir,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tcurrentDir = dirname(currentDir);\n\t}\n\n\tthrow new Error(\n\t\t'Configuration file not found. Please create gkm.config.json, gkm.config.ts, or gkm.config.js in the project root.',\n\t);\n}\n\n/**\n * Get app name from package.json in the given directory.\n * Handles scoped packages by extracting the name after the scope.\n *\n * @example\n * getAppNameFromCwd('/path/to/apps/api')\n * // package.json: { \"name\": \"@myorg/api\" }\n * // Returns: 'api'\n */\nexport function getAppNameFromCwd(cwd: string = process.cwd()): string | null {\n\tconst packageJsonPath = join(cwd, 'package.json');\n\n\tif (!existsSync(packageJsonPath)) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\t\tconst name = packageJson.name as string | undefined;\n\n\t\tif (!name) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Handle scoped packages: @scope/name -> name\n\t\tif (name.startsWith('@') && name.includes('/')) {\n\t\t\treturn name.split('/')[1] ?? null;\n\t\t}\n\n\t\treturn name;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\ninterface RawConfigResult {\n\tconfig: GkmConfig | WorkspaceConfig;\n\tworkspaceRoot: string;\n}\n\n/**\n * Load raw configuration from file.\n */\nasync function loadRawConfig(cwd: string): Promise<RawConfigResult> {\n\tconst { configPath, workspaceRoot } = findConfigPath(cwd);\n\n\ttry {\n\t\tconst config = await import(configPath);\n\t\treturn {\n\t\t\tconfig: config.default,\n\t\t\tworkspaceRoot,\n\t\t};\n\t} catch (error) {\n\t\tthrow new Error(`Failed to load config: ${(error as Error).message}`);\n\t}\n}\n\n/**\n * Load configuration file (single-app format).\n * For backwards compatibility with existing code.\n *\n * @deprecated Use loadWorkspaceConfig for new code\n */\nexport async function loadConfig(\n\tcwd: string = process.cwd(),\n): Promise<GkmConfig> {\n\tconst { config } = await loadRawConfig(cwd);\n\n\t// If it's a workspace config, throw an error\n\tif (isWorkspaceConfig(config)) {\n\t\tthrow new Error(\n\t\t\t'Workspace configuration detected. Use loadWorkspaceConfig() instead.',\n\t\t);\n\t}\n\n\treturn config;\n}\n\n/**\n * Load configuration file and process it as a workspace.\n * Works with both single-app and workspace configurations.\n *\n * Single-app configs are automatically wrapped as a workspace with one app.\n *\n * @example\n * ```ts\n * const { type, workspace } = await loadWorkspaceConfig();\n *\n * if (type === 'workspace') {\n * console.log('Multi-app workspace:', workspace.apps);\n * } else {\n * console.log('Single app wrapped as workspace');\n * }\n * ```\n */\nexport async function loadWorkspaceConfig(\n\tcwd: string = process.cwd(),\n): Promise<LoadedConfig> {\n\tconst { config, workspaceRoot } = await loadRawConfig(cwd);\n\treturn processConfig(config, workspaceRoot);\n}\n\nexport interface AppConfigResult {\n\tappName: string;\n\tapp: NormalizedAppConfig;\n\tgkmConfig: GkmConfig;\n\tworkspace: NormalizedWorkspace;\n\tworkspaceRoot: string;\n\tappRoot: string;\n}\n\n/**\n * Load app-specific configuration from workspace.\n * Uses the app name from package.json to find the correct app config.\n *\n * @example\n * ```ts\n * // From apps/api directory with package.json: { \"name\": \"@myorg/api\" }\n * const { app, workspace, workspaceRoot } = await loadAppConfig();\n * console.log(app.routes); // './src/endpoints/**\\/*.ts'\n * ```\n */\nexport async function loadAppConfig(\n\tcwd: string = process.cwd(),\n): Promise<AppConfigResult> {\n\tconst appName = getAppNameFromCwd(cwd);\n\n\tif (!appName) {\n\t\tthrow new Error(\n\t\t\t'Could not determine app name. Ensure package.json exists with a \"name\" field.',\n\t\t);\n\t}\n\n\tconst { config, workspaceRoot } = await loadRawConfig(cwd);\n\tconst loadedConfig = processConfig(config, workspaceRoot);\n\n\t// Find the app in workspace (apps is a Record<string, NormalizedAppConfig>)\n\tconst app = loadedConfig.workspace.apps[appName];\n\n\tif (!app) {\n\t\tconst availableApps = Object.keys(loadedConfig.workspace.apps).join(', ');\n\t\tthrow new Error(\n\t\t\t`App \"${appName}\" not found in workspace config. Available apps: ${availableApps}. ` +\n\t\t\t\t`Ensure the package.json name matches the app key in gkm.config.ts.`,\n\t\t);\n\t}\n\n\t// Get the app's GKM config using the helper\n\tconst gkmConfig = getAppGkmConfig(loadedConfig.workspace, appName);\n\n\tif (!gkmConfig) {\n\t\tthrow new Error(\n\t\t\t`App \"${appName}\" is not a backend app and cannot be run with gkm dev.`,\n\t\t);\n\t}\n\n\treturn {\n\t\tappName,\n\t\tapp,\n\t\tgkmConfig,\n\t\tworkspace: loadedConfig.workspace,\n\t\tworkspaceRoot,\n\t\tappRoot: join(workspaceRoot, app.path),\n\t};\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"config-BC5n1a2D.mjs","names":["config: GkmConfig","configString: string","defaultAlias: string","cwd: string"],"sources":["../src/config.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join, parse } from 'node:path';\nimport type { GkmConfig } from './types.js';\nimport {\n\tgetAppGkmConfig,\n\tisWorkspaceConfig,\n\ttype LoadedConfig,\n\ttype NormalizedAppConfig,\n\ttype NormalizedWorkspace,\n\tprocessConfig,\n\ttype WorkspaceConfig,\n} from './workspace/index.js';\n\nexport type { GkmConfig } from './types.js';\nexport type { LoadedConfig, WorkspaceConfig } from './workspace/index.js';\nexport { defineWorkspace } from './workspace/index.js';\n/**\n * Define GKM configuration with full TypeScript support.\n * This is an identity function that provides type safety and autocomplete.\n *\n * @example\n * ```ts\n * // gkm.config.ts\n * import { defineConfig } from '@geekmidas/cli/config';\n *\n * export default defineConfig({\n * routes: './src/endpoints/**\\/*.ts',\n * envParser: './src/config/env',\n * logger: './src/config/logger',\n * telescope: true,\n * });\n * ```\n */\nexport function defineConfig(config: GkmConfig): GkmConfig {\n\treturn config;\n}\n\nexport interface ParsedModuleConfig {\n\tpath: string;\n\timportPattern: string;\n}\n\n/**\n * Parse a module config string into path and import pattern.\n *\n * @param configString - Config string in format \"./path/to/module\" or \"./path/to/module#exportName\"\n * @param defaultAlias - The default alias name to use if no export name specified\n * @returns Object with path and import pattern\n *\n * @example\n * parseModuleConfig('./src/config/env', 'envParser')\n * // { path: './src/config/env', importPattern: 'envParser' }\n *\n * parseModuleConfig('./src/config/env#envParser', 'envParser')\n * // { path: './src/config/env', importPattern: '{ envParser }' }\n *\n * parseModuleConfig('./src/config/env#myEnv', 'envParser')\n * // { path: './src/config/env', importPattern: '{ myEnv as envParser }' }\n */\nexport function parseModuleConfig(\n\tconfigString: string,\n\tdefaultAlias: string,\n): ParsedModuleConfig {\n\tconst parts = configString.split('#');\n\tconst path = parts[0] ?? configString;\n\tconst exportName = parts[1];\n\tconst importPattern = !exportName\n\t\t? defaultAlias\n\t\t: exportName === defaultAlias\n\t\t\t? `{ ${defaultAlias} }`\n\t\t\t: `{ ${exportName} as ${defaultAlias} }`;\n\n\treturn { path, importPattern };\n}\n\nexport interface ConfigDiscoveryResult {\n\tconfigPath: string;\n\tworkspaceRoot: string;\n}\n\n/**\n * Find and return the path to the config file.\n *\n * Resolution order:\n * 1. GKM_CONFIG_PATH env var (set by workspace dev command)\n * 2. Walk up directory tree from cwd\n */\nfunction findConfigPath(cwd: string): ConfigDiscoveryResult {\n\tconst files = ['gkm.config.json', 'gkm.config.ts', 'gkm.config.js'];\n\n\t// Check GKM_CONFIG_PATH env var first (set by workspace dev command)\n\tconst envConfigPath = process.env.GKM_CONFIG_PATH;\n\tif (envConfigPath && existsSync(envConfigPath)) {\n\t\treturn {\n\t\t\tconfigPath: envConfigPath,\n\t\t\tworkspaceRoot: dirname(envConfigPath),\n\t\t};\n\t}\n\n\t// Walk up directory tree to find config\n\tlet currentDir = cwd;\n\tconst { root } = parse(currentDir);\n\n\twhile (currentDir !== root) {\n\t\tfor (const file of files) {\n\t\t\tconst configPath = join(currentDir, file);\n\t\t\tif (existsSync(configPath)) {\n\t\t\t\treturn {\n\t\t\t\t\tconfigPath,\n\t\t\t\t\tworkspaceRoot: currentDir,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tcurrentDir = dirname(currentDir);\n\t}\n\n\tthrow new Error(\n\t\t'Configuration file not found. Please create gkm.config.json, gkm.config.ts, or gkm.config.js in the project root.',\n\t);\n}\n\n/**\n * Get app name from package.json in the given directory.\n * Handles scoped packages by extracting the name after the scope.\n *\n * @example\n * getAppNameFromCwd('/path/to/apps/api')\n * // package.json: { \"name\": \"@myorg/api\" }\n * // Returns: 'api'\n */\nexport function getAppNameFromCwd(cwd: string = process.cwd()): string | null {\n\tconst packageJsonPath = join(cwd, 'package.json');\n\n\tif (!existsSync(packageJsonPath)) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n\t\tconst name = packageJson.name as string | undefined;\n\n\t\tif (!name) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Handle scoped packages: @scope/name -> name\n\t\tif (name.startsWith('@') && name.includes('/')) {\n\t\t\treturn name.split('/')[1] ?? null;\n\t\t}\n\n\t\treturn name;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\ninterface RawConfigResult {\n\tconfig: GkmConfig | WorkspaceConfig;\n\tworkspaceRoot: string;\n}\n\n/**\n * Load raw configuration from file.\n */\nasync function loadRawConfig(cwd: string): Promise<RawConfigResult> {\n\tconst { configPath, workspaceRoot } = findConfigPath(cwd);\n\n\ttry {\n\t\tconst config = await import(configPath);\n\t\treturn {\n\t\t\tconfig: config.default,\n\t\t\tworkspaceRoot,\n\t\t};\n\t} catch (error) {\n\t\tthrow new Error(`Failed to load config: ${(error as Error).message}`);\n\t}\n}\n\n/**\n * Load configuration file (single-app format).\n * For backwards compatibility with existing code.\n *\n * @deprecated Use loadWorkspaceConfig for new code\n */\nexport async function loadConfig(\n\tcwd: string = process.cwd(),\n): Promise<GkmConfig> {\n\tconst { config } = await loadRawConfig(cwd);\n\n\t// If it's a workspace config, throw an error\n\tif (isWorkspaceConfig(config)) {\n\t\tthrow new Error(\n\t\t\t'Workspace configuration detected. Use loadWorkspaceConfig() instead.',\n\t\t);\n\t}\n\n\treturn config;\n}\n\n/**\n * Load configuration file and process it as a workspace.\n * Works with both single-app and workspace configurations.\n *\n * Single-app configs are automatically wrapped as a workspace with one app.\n *\n * @example\n * ```ts\n * const { type, workspace } = await loadWorkspaceConfig();\n *\n * if (type === 'workspace') {\n * console.log('Multi-app workspace:', workspace.apps);\n * } else {\n * console.log('Single app wrapped as workspace');\n * }\n * ```\n */\nexport async function loadWorkspaceConfig(\n\tcwd: string = process.cwd(),\n): Promise<LoadedConfig> {\n\tconst { config, workspaceRoot } = await loadRawConfig(cwd);\n\treturn processConfig(config, workspaceRoot);\n}\n\nexport interface AppConfigResult {\n\tappName: string;\n\tapp: NormalizedAppConfig;\n\tgkmConfig: GkmConfig;\n\tworkspace: NormalizedWorkspace;\n\tworkspaceRoot: string;\n\tappRoot: string;\n}\n\n/**\n * Load app-specific configuration from workspace.\n * Uses the app name from package.json to find the correct app config.\n *\n * @example\n * ```ts\n * // From apps/api directory with package.json: { \"name\": \"@myorg/api\" }\n * const { app, workspace, workspaceRoot } = await loadAppConfig();\n * console.log(app.routes); // './src/endpoints/**\\/*.ts'\n * ```\n */\nexport async function loadAppConfig(\n\tcwd: string = process.cwd(),\n): Promise<AppConfigResult> {\n\tconst appName = getAppNameFromCwd(cwd);\n\n\tif (!appName) {\n\t\tthrow new Error(\n\t\t\t'Could not determine app name. Ensure package.json exists with a \"name\" field.',\n\t\t);\n\t}\n\n\tconst { config, workspaceRoot } = await loadRawConfig(cwd);\n\tconst loadedConfig = processConfig(config, workspaceRoot);\n\n\t// Find the app in workspace (apps is a Record<string, NormalizedAppConfig>)\n\tconst app = loadedConfig.workspace.apps[appName];\n\n\tif (!app) {\n\t\tconst availableApps = Object.keys(loadedConfig.workspace.apps).join(', ');\n\t\tthrow new Error(\n\t\t\t`App \"${appName}\" not found in workspace config. Available apps: ${availableApps}. ` +\n\t\t\t\t`Ensure the package.json name matches the app key in gkm.config.ts.`,\n\t\t);\n\t}\n\n\t// Get the app's GKM config using the helper\n\tconst gkmConfig = getAppGkmConfig(loadedConfig.workspace, appName);\n\n\tif (!gkmConfig) {\n\t\tthrow new Error(\n\t\t\t`App \"${appName}\" is not a backend app and cannot be run with gkm dev.`,\n\t\t);\n\t}\n\n\treturn {\n\t\tappName,\n\t\tapp,\n\t\tgkmConfig,\n\t\tworkspace: loadedConfig.workspace,\n\t\tworkspaceRoot,\n\t\tappRoot: join(workspaceRoot, app.path),\n\t};\n}\n"],"mappings":"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"}
package/dist/config.cjs CHANGED
@@ -1,5 +1,5 @@
1
- const require_workspace = require('./workspace-CiZBOjf9.cjs');
2
- const require_config = require('./config-BhryDQEq.cjs');
1
+ const require_workspace = require('./workspace-My0A4IRO.cjs');
2
+ const require_config = require('./config-BAE9LFC1.cjs');
3
3
 
4
4
  exports.defineConfig = require_config.defineConfig;
5
5
  exports.defineWorkspace = require_workspace.defineWorkspace;
package/dist/config.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { GkmConfig } from "./types-l53qUmGt.cjs";
2
- import { LoadedConfig, NormalizedAppConfig, NormalizedWorkspace, WorkspaceConfig, defineWorkspace } from "./index-DEWYvYvg.cjs";
2
+ import { LoadedConfig, NormalizedAppConfig, NormalizedWorkspace, WorkspaceConfig, defineWorkspace } from "./index-CpchsC9w.cjs";
3
3
 
4
4
  //#region src/config.d.ts
5
5
 
package/dist/config.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { GkmConfig } from "./types-K2uQJ-FO.mjs";
2
- import { LoadedConfig, NormalizedAppConfig, NormalizedWorkspace, WorkspaceConfig, defineWorkspace } from "./index-CWN-bgrO.mjs";
2
+ import { LoadedConfig, NormalizedAppConfig, NormalizedWorkspace, WorkspaceConfig, defineWorkspace } from "./index-C7TkoYmt.mjs";
3
3
 
4
4
  //#region src/config.d.ts
5
5
 
package/dist/config.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { defineWorkspace } from "./workspace-DQjmv9lk.mjs";
2
- import { defineConfig, getAppNameFromCwd, loadAppConfig, loadConfig, loadWorkspaceConfig, parseModuleConfig } from "./config-C9bdq0l-.mjs";
1
+ import { defineWorkspace } from "./workspace-DFJ3sWfY.mjs";
2
+ import { defineConfig, getAppNameFromCwd, loadAppConfig, loadConfig, loadWorkspaceConfig, parseModuleConfig } from "./config-BC5n1a2D.mjs";
3
3
 
4
4
  export { defineConfig, defineWorkspace, getAppNameFromCwd, loadAppConfig, loadConfig, loadWorkspaceConfig, parseModuleConfig };
@@ -296,6 +296,7 @@ declare const WorkspaceConfigSchema: z.ZodObject<{
296
296
  type: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
297
297
  backend: "backend";
298
298
  frontend: "frontend";
299
+ auth: "auth";
299
300
  }>>>;
300
301
  path: z.ZodString;
301
302
  port: z.ZodNumber;
@@ -345,6 +346,9 @@ declare const WorkspaceConfigSchema: z.ZodObject<{
345
346
  client: z.ZodOptional<z.ZodObject<{
346
347
  output: z.ZodOptional<z.ZodString>;
347
348
  }, z.core.$strip>>;
349
+ provider: z.ZodOptional<z.ZodEnum<{
350
+ "better-auth": "better-auth";
351
+ }>>;
348
352
  }, z.core.$strip>>;
349
353
  shared: z.ZodOptional<z.ZodObject<{
350
354
  packages: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -492,4 +496,4 @@ declare function getDependencyEnvVars(workspace: NormalizedWorkspace, appName: s
492
496
 
493
497
  //#endregion
494
498
  export { AppConfig, AppConfigInput, AppInput, AppsRecord, ClientConfig, ConstrainedApps, DeployConfig, DeployTarget, DokployWorkspaceConfig, InferAppNames, InferredWorkspaceConfig, LoadedConfig, MailServiceConfig, ModelsConfig, NormalizedAppConfig, NormalizedWorkspace, PHASE_2_DEPLOY_TARGETS, SUPPORTED_DEPLOY_TARGETS, SecretsConfig, ServiceImageConfig, ServicesConfig, SharedConfig, WorkspaceConfig, WorkspaceConfigSchema, WorkspaceInput, defineWorkspace, formatValidationErrors, getAppBuildOrder, getAppGkmConfig, getDependencyEnvVars, getDeployTargetError, isDeployTargetSupported, isPhase2DeployTarget, isWorkspaceConfig, normalizeWorkspace, processConfig, safeValidateWorkspaceConfig, validateWorkspaceConfig, wrapSingleAppAsWorkspace };
495
- //# sourceMappingURL=index-CWN-bgrO.d.mts.map
499
+ //# sourceMappingURL=index-C7TkoYmt.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-C7TkoYmt.d.mts","names":[],"sources":["../src/workspace/types.ts","../src/workspace/schema.ts","../src/workspace/index.ts"],"sourcesContent":[],"mappings":"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"}
@@ -296,6 +296,7 @@ declare const WorkspaceConfigSchema: z.ZodObject<{
296
296
  type: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
297
297
  backend: "backend";
298
298
  frontend: "frontend";
299
+ auth: "auth";
299
300
  }>>>;
300
301
  path: z.ZodString;
301
302
  port: z.ZodNumber;
@@ -345,6 +346,9 @@ declare const WorkspaceConfigSchema: z.ZodObject<{
345
346
  client: z.ZodOptional<z.ZodObject<{
346
347
  output: z.ZodOptional<z.ZodString>;
347
348
  }, z.core.$strip>>;
349
+ provider: z.ZodOptional<z.ZodEnum<{
350
+ "better-auth": "better-auth";
351
+ }>>;
348
352
  }, z.core.$strip>>;
349
353
  shared: z.ZodOptional<z.ZodObject<{
350
354
  packages: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -492,4 +496,4 @@ declare function getDependencyEnvVars(workspace: NormalizedWorkspace, appName: s
492
496
 
493
497
  //#endregion
494
498
  export { AppConfig, AppConfigInput, AppInput, AppsRecord, ClientConfig, ConstrainedApps, DeployConfig, DeployTarget, DokployWorkspaceConfig, InferAppNames, InferredWorkspaceConfig, LoadedConfig, MailServiceConfig, ModelsConfig, NormalizedAppConfig, NormalizedWorkspace, PHASE_2_DEPLOY_TARGETS, SUPPORTED_DEPLOY_TARGETS, SecretsConfig, ServiceImageConfig, ServicesConfig, SharedConfig, WorkspaceConfig, WorkspaceConfigSchema, WorkspaceInput, defineWorkspace, formatValidationErrors, getAppBuildOrder, getAppGkmConfig, getDependencyEnvVars, getDeployTargetError, isDeployTargetSupported, isPhase2DeployTarget, isWorkspaceConfig, normalizeWorkspace, processConfig, safeValidateWorkspaceConfig, validateWorkspaceConfig, wrapSingleAppAsWorkspace };
495
- //# sourceMappingURL=index-DEWYvYvg.d.cts.map
499
+ //# sourceMappingURL=index-CpchsC9w.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CpchsC9w.d.cts","names":[],"sources":["../src/workspace/types.ts","../src/workspace/schema.ts","../src/workspace/index.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env -S npx tsx
2
2
  const require_chunk = require('./chunk-CUT6urMc.cjs');
3
- const require_workspace = require('./workspace-CiZBOjf9.cjs');
4
- const require_config = require('./config-BhryDQEq.cjs');
5
- const require_openapi = require('./openapi-D82bBqG7.cjs');
3
+ const require_workspace = require('./workspace-My0A4IRO.cjs');
4
+ const require_config = require('./config-BAE9LFC1.cjs');
5
+ const require_openapi = require('./openapi-a-e3Y8WA.cjs');
6
6
  const require_storage = require('./storage-BPRgh3DU.cjs');
7
7
  const require_dokploy_api = require('./dokploy-api-C5czOZoc.cjs');
8
8
  const require_openapi_react_query = require('./openapi-react-query-DvNpdDpM.cjs');
@@ -27,7 +27,7 @@ const node_module = require_chunk.__toESM(require("node:module"));
27
27
 
28
28
  //#region package.json
29
29
  var name = "@geekmidas/cli";
30
- var version = "0.29.0";
30
+ var version = "0.30.0";
31
31
  var description = "CLI tools for building Lambda handlers, server applications, and generating OpenAPI specs";
32
32
  var private$1 = false;
33
33
  var type = "module";
@@ -1017,10 +1017,14 @@ async function devCommand(options) {
1017
1017
  const appName = require_config.getAppNameFromCwd();
1018
1018
  let config;
1019
1019
  let appRoot = process.cwd();
1020
+ let secretsRoot = process.cwd();
1021
+ let workspaceAppName;
1020
1022
  if (appName) try {
1021
1023
  const appConfig = await require_config.loadAppConfig();
1022
1024
  config = appConfig.gkmConfig;
1023
1025
  appRoot = appConfig.appRoot;
1026
+ secretsRoot = appConfig.workspaceRoot;
1027
+ workspaceAppName = appConfig.appName;
1024
1028
  logger$8.log(`📦 Running app: ${appConfig.appName}`);
1025
1029
  } catch {
1026
1030
  const loadedConfig = await require_config.loadWorkspaceConfig();
@@ -1073,7 +1077,16 @@ async function devCommand(options) {
1073
1077
  await buildServer(config, buildContext, resolved.providers[0], enableOpenApi, appRoot);
1074
1078
  if (enableOpenApi) await require_openapi.generateOpenApi(config);
1075
1079
  const runtime = config.runtime ?? "node";
1076
- const devServer = new DevServer(resolved.providers[0], options.port || 3e3, options.portExplicit ?? false, enableOpenApi, telescope, studio, runtime, appRoot);
1080
+ let secretsJsonPath;
1081
+ const appSecrets = await loadSecretsForApp(secretsRoot, workspaceAppName);
1082
+ if (Object.keys(appSecrets).length > 0) {
1083
+ const secretsDir = (0, node_path.join)(secretsRoot, ".gkm");
1084
+ await (0, node_fs_promises.mkdir)(secretsDir, { recursive: true });
1085
+ secretsJsonPath = (0, node_path.join)(secretsDir, "dev-secrets.json");
1086
+ await (0, node_fs_promises.writeFile)(secretsJsonPath, JSON.stringify(appSecrets, null, 2));
1087
+ logger$8.log(`🔐 Loaded ${Object.keys(appSecrets).length} secret(s)`);
1088
+ }
1089
+ const devServer = new DevServer(resolved.providers[0], options.port || 3e3, options.portExplicit ?? false, enableOpenApi, telescope, studio, runtime, appRoot, secretsJsonPath);
1077
1090
  await devServer.start();
1078
1091
  const envParserFile = config.envParser.split("#")[0] ?? config.envParser;
1079
1092
  const loggerFile = config.logger.split("#")[0] ?? config.logger;
@@ -1245,6 +1258,31 @@ async function loadDevSecrets(workspace) {
1245
1258
  return {};
1246
1259
  }
1247
1260
  /**
1261
+ * Load secrets from a path for dev mode.
1262
+ * For single app: returns secrets as-is.
1263
+ * For workspace app: maps {APP}_DATABASE_URL → DATABASE_URL.
1264
+ * @internal Exported for testing
1265
+ */
1266
+ async function loadSecretsForApp(secretsRoot, appName) {
1267
+ const stages = ["dev", "development"];
1268
+ let secrets = {};
1269
+ for (const stage of stages) if (require_storage.secretsExist(stage, secretsRoot)) {
1270
+ const stageSecrets = await require_storage.readStageSecrets(stage, secretsRoot);
1271
+ if (stageSecrets) {
1272
+ logger$8.log(`🔐 Loading secrets from stage: ${stage}`);
1273
+ secrets = require_storage.toEmbeddableSecrets(stageSecrets);
1274
+ break;
1275
+ }
1276
+ }
1277
+ if (Object.keys(secrets).length === 0) return {};
1278
+ if (!appName) return secrets;
1279
+ const prefix = appName.toUpperCase();
1280
+ const mapped = { ...secrets };
1281
+ const appDbUrl = secrets[`${prefix}_DATABASE_URL`];
1282
+ if (appDbUrl) mapped.DATABASE_URL = appDbUrl;
1283
+ return mapped;
1284
+ }
1285
+ /**
1248
1286
  * Start docker-compose services for the workspace.
1249
1287
  * @internal Exported for testing
1250
1288
  */
@@ -1489,7 +1527,7 @@ var DevServer = class {
1489
1527
  serverProcess = null;
1490
1528
  isRunning = false;
1491
1529
  actualPort;
1492
- constructor(provider, requestedPort, portExplicit, enableOpenApi, telescope, studio, runtime = "node", appRoot = process.cwd()) {
1530
+ constructor(provider, requestedPort, portExplicit, enableOpenApi, telescope, studio, runtime = "node", appRoot = process.cwd(), secretsJsonPath) {
1493
1531
  this.provider = provider;
1494
1532
  this.requestedPort = requestedPort;
1495
1533
  this.portExplicit = portExplicit;
@@ -1498,6 +1536,7 @@ var DevServer = class {
1498
1536
  this.studio = studio;
1499
1537
  this.runtime = runtime;
1500
1538
  this.appRoot = appRoot;
1539
+ this.secretsJsonPath = secretsJsonPath;
1501
1540
  this.actualPort = requestedPort;
1502
1541
  }
1503
1542
  async start() {
@@ -1576,10 +1615,20 @@ var DevServer = class {
1576
1615
  await this.start();
1577
1616
  }
1578
1617
  async createServerEntry() {
1579
- const { writeFile: writeFile$9 } = await import("node:fs/promises");
1618
+ const { writeFile: fsWriteFile } = await import("node:fs/promises");
1580
1619
  const { relative: relative$7, dirname: dirname$7 } = await import("node:path");
1581
1620
  const serverPath = (0, node_path.join)(this.appRoot, ".gkm", this.provider, "server.ts");
1582
1621
  const relativeAppPath = relative$7(dirname$7(serverPath), (0, node_path.join)(dirname$7(serverPath), "app.js"));
1622
+ const credentialsInjection = this.secretsJsonPath ? `import { Credentials } from '@geekmidas/envkit/credentials';
1623
+ import { existsSync, readFileSync } from 'node:fs';
1624
+
1625
+ // Inject dev secrets into Credentials (must happen before app import)
1626
+ const secretsPath = '${this.secretsJsonPath}';
1627
+ if (existsSync(secretsPath)) {
1628
+ Object.assign(Credentials, JSON.parse(readFileSync(secretsPath, 'utf-8')));
1629
+ }
1630
+
1631
+ ` : "";
1583
1632
  const serveCode = this.runtime === "bun" ? `Bun.serve({
1584
1633
  port,
1585
1634
  fetch: app.fetch,
@@ -1599,7 +1648,7 @@ var DevServer = class {
1599
1648
  * Development server entry point
1600
1649
  * This file is auto-generated by 'gkm dev'
1601
1650
  */
1602
- import { createApp } from './${relativeAppPath.startsWith(".") ? relativeAppPath : `./${relativeAppPath}`}';
1651
+ ${credentialsInjection}import { createApp } from './${relativeAppPath.startsWith(".") ? relativeAppPath : `./${relativeAppPath}`}';
1603
1652
 
1604
1653
  const port = process.argv.includes('--port')
1605
1654
  ? Number.parseInt(process.argv[process.argv.indexOf('--port') + 1])
@@ -1619,7 +1668,7 @@ start({
1619
1668
  process.exit(1);
1620
1669
  });
1621
1670
  `;
1622
- await writeFile$9(serverPath, content);
1671
+ await fsWriteFile(serverPath, content);
1623
1672
  }
1624
1673
  };
1625
1674