@ncukondo/search-hub 0.1.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.
- package/LICENSE +21 -0
- package/README.md +93 -0
- package/dist/_virtual/___vite-browser-external.js +7 -0
- package/dist/_virtual/___vite-browser-external.js.map +1 -0
- package/dist/_virtual/__vite-browser-external.js +5 -0
- package/dist/_virtual/__vite-browser-external.js.map +1 -0
- package/dist/_virtual/_commonjsHelpers.js +28 -0
- package/dist/_virtual/_commonjsHelpers.js.map +1 -0
- package/dist/_virtual/cli-progress.js +6 -0
- package/dist/_virtual/cli-progress.js.map +1 -0
- package/dist/_virtual/index.js +5 -0
- package/dist/_virtual/index.js.map +1 -0
- package/dist/_virtual/index2.js +5 -0
- package/dist/_virtual/index2.js.map +1 -0
- package/dist/cli/commands/config.d.ts +37 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +117 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/export.d.ts +26 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +86 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/init.d.ts +45 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +134 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/query/translate.d.ts +32 -0
- package/dist/cli/commands/query/translate.d.ts.map +1 -0
- package/dist/cli/commands/query/translate.js +76 -0
- package/dist/cli/commands/query/translate.js.map +1 -0
- package/dist/cli/commands/query/validate.d.ts +25 -0
- package/dist/cli/commands/query/validate.d.ts.map +1 -0
- package/dist/cli/commands/query/validate.js +68 -0
- package/dist/cli/commands/query/validate.js.map +1 -0
- package/dist/cli/commands/register.d.ts +39 -0
- package/dist/cli/commands/register.d.ts.map +1 -0
- package/dist/cli/commands/register.js +78 -0
- package/dist/cli/commands/register.js.map +1 -0
- package/dist/cli/commands/resume-executor.d.ts +19 -0
- package/dist/cli/commands/resume-executor.d.ts.map +1 -0
- package/dist/cli/commands/resume-executor.js +170 -0
- package/dist/cli/commands/resume-executor.js.map +1 -0
- package/dist/cli/commands/resume.d.ts +26 -0
- package/dist/cli/commands/resume.d.ts.map +1 -0
- package/dist/cli/commands/resume.js +51 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/search-executor.d.ts +26 -0
- package/dist/cli/commands/search-executor.d.ts.map +1 -0
- package/dist/cli/commands/search-executor.js +315 -0
- package/dist/cli/commands/search-executor.js.map +1 -0
- package/dist/cli/commands/search.d.ts +30 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +67 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/status.d.ts +41 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +123 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/e2e-helpers.d.ts +165 -0
- package/dist/cli/e2e-helpers.d.ts.map +1 -0
- package/dist/cli/exit-codes.d.ts +25 -0
- package/dist/cli/exit-codes.d.ts.map +1 -0
- package/dist/cli/exit-codes.js +18 -0
- package/dist/cli/exit-codes.js.map +1 -0
- package/dist/cli/index.d.ts +25 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +638 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/progress.d.ts +24 -0
- package/dist/cli/utils/progress.d.ts.map +1 -0
- package/dist/cli/utils/progress.js +128 -0
- package/dist/cli/utils/progress.js.map +1 -0
- package/dist/cli/utils/sessions-dir.d.ts +14 -0
- package/dist/cli/utils/sessions-dir.d.ts.map +1 -0
- package/dist/cli/utils/sessions-dir.js +21 -0
- package/dist/cli/utils/sessions-dir.js.map +1 -0
- package/dist/cli/utils/validation.d.ts +18 -0
- package/dist/cli/utils/validation.d.ts.map +1 -0
- package/dist/cli/utils/validation.js +24 -0
- package/dist/cli/utils/validation.js.map +1 -0
- package/dist/config/defaults.d.ts +12 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +10 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/env.d.ts +12 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +36 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/loader.d.ts +49 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +72 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/paths.d.ts +23 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +22 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/schema.d.ts +109 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +74 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/integration/ref-cli.d.ts +41 -0
- package/dist/integration/ref-cli.d.ts.map +1 -0
- package/dist/integration/ref-cli.js +132 -0
- package/dist/integration/ref-cli.js.map +1 -0
- package/dist/integration/register.d.ts +27 -0
- package/dist/integration/register.d.ts.map +1 -0
- package/dist/integration/register.js +108 -0
- package/dist/integration/register.js.map +1 -0
- package/dist/integration/types.d.ts +61 -0
- package/dist/integration/types.d.ts.map +1 -0
- package/dist/integration/types.js +61 -0
- package/dist/integration/types.js.map +1 -0
- package/dist/node_modules/cli-progress/cli-progress.js +37 -0
- package/dist/node_modules/cli-progress/cli-progress.js.map +1 -0
- package/dist/node_modules/cli-progress/lib/eta.js +52 -0
- package/dist/node_modules/cli-progress/lib/eta.js.map +1 -0
- package/dist/node_modules/cli-progress/lib/format-bar.js +16 -0
- package/dist/node_modules/cli-progress/lib/format-bar.js.map +1 -0
- package/dist/node_modules/cli-progress/lib/format-time.js +32 -0
- package/dist/node_modules/cli-progress/lib/format-time.js.map +1 -0
- package/dist/node_modules/cli-progress/lib/format-value.js +25 -0
- package/dist/node_modules/cli-progress/lib/format-value.js.map +1 -0
- package/dist/node_modules/cli-progress/lib/formatter.js +57 -0
- package/dist/node_modules/cli-progress/lib/formatter.js.map +1 -0
- package/dist/node_modules/cli-progress/lib/generic-bar.js +137 -0
- package/dist/node_modules/cli-progress/lib/generic-bar.js.map +1 -0
- package/dist/node_modules/cli-progress/lib/multi-bar.js +147 -0
- package/dist/node_modules/cli-progress/lib/multi-bar.js.map +1 -0
- package/dist/node_modules/cli-progress/lib/options.js +59 -0
- package/dist/node_modules/cli-progress/lib/options.js.map +1 -0
- package/dist/node_modules/cli-progress/lib/single-bar.js +95 -0
- package/dist/node_modules/cli-progress/lib/single-bar.js.map +1 -0
- package/dist/node_modules/cli-progress/lib/terminal.js +125 -0
- package/dist/node_modules/cli-progress/lib/terminal.js.map +1 -0
- package/dist/node_modules/cli-progress/node_modules/ansi-regex/index.js +18 -0
- package/dist/node_modules/cli-progress/node_modules/ansi-regex/index.js.map +1 -0
- package/dist/node_modules/cli-progress/node_modules/emoji-regex/index.js +14 -0
- package/dist/node_modules/cli-progress/node_modules/emoji-regex/index.js.map +1 -0
- package/dist/node_modules/cli-progress/node_modules/string-width/index.js +44 -0
- package/dist/node_modules/cli-progress/node_modules/string-width/index.js.map +1 -0
- package/dist/node_modules/cli-progress/node_modules/strip-ansi/index.js +14 -0
- package/dist/node_modules/cli-progress/node_modules/strip-ansi/index.js.map +1 -0
- package/dist/node_modules/cli-progress/presets/index.js +25 -0
- package/dist/node_modules/cli-progress/presets/index.js.map +1 -0
- package/dist/node_modules/cli-progress/presets/legacy.js +16 -0
- package/dist/node_modules/cli-progress/presets/legacy.js.map +1 -0
- package/dist/node_modules/cli-progress/presets/rect.js +16 -0
- package/dist/node_modules/cli-progress/presets/rect.js.map +1 -0
- package/dist/node_modules/cli-progress/presets/shades-classic.js +16 -0
- package/dist/node_modules/cli-progress/presets/shades-classic.js.map +1 -0
- package/dist/node_modules/cli-progress/presets/shades-grey.js +16 -0
- package/dist/node_modules/cli-progress/presets/shades-grey.js.map +1 -0
- package/dist/node_modules/env-paths/index.js +58 -0
- package/dist/node_modules/env-paths/index.js.map +1 -0
- package/dist/node_modules/fast-xml-parser/src/ignoreAttributes.js +22 -0
- package/dist/node_modules/fast-xml-parser/src/ignoreAttributes.js.map +1 -0
- package/dist/node_modules/fast-xml-parser/src/util.js +33 -0
- package/dist/node_modules/fast-xml-parser/src/util.js.map +1 -0
- package/dist/node_modules/fast-xml-parser/src/validator.js +309 -0
- package/dist/node_modules/fast-xml-parser/src/validator.js.map +1 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/DocTypeReader.js +265 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/DocTypeReader.js.map +1 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/OptionsBuilder.js +53 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/OptionsBuilder.js.map +1 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/OrderedObjParser.js +515 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/OrderedObjParser.js.map +1 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/XMLParser.js +68 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/XMLParser.js.map +1 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/node2json.js +88 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/node2json.js.map +1 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/xmlNode.js +36 -0
- package/dist/node_modules/fast-xml-parser/src/xmlparser/xmlNode.js.map +1 -0
- package/dist/node_modules/is-fullwidth-code-point/index.js +37 -0
- package/dist/node_modules/is-fullwidth-code-point/index.js.map +1 -0
- package/dist/node_modules/strnum/strnum.js +100 -0
- package/dist/node_modules/strnum/strnum.js.map +1 -0
- package/dist/providers/arxiv/client.d.ts +54 -0
- package/dist/providers/arxiv/client.d.ts.map +1 -0
- package/dist/providers/arxiv/client.js +105 -0
- package/dist/providers/arxiv/client.js.map +1 -0
- package/dist/providers/arxiv/index.d.ts +14 -0
- package/dist/providers/arxiv/index.d.ts.map +1 -0
- package/dist/providers/arxiv/parser.d.ts +16 -0
- package/dist/providers/arxiv/parser.d.ts.map +1 -0
- package/dist/providers/arxiv/parser.js +144 -0
- package/dist/providers/arxiv/parser.js.map +1 -0
- package/dist/providers/arxiv/provider.d.ts +39 -0
- package/dist/providers/arxiv/provider.d.ts.map +1 -0
- package/dist/providers/arxiv/provider.js +153 -0
- package/dist/providers/arxiv/provider.js.map +1 -0
- package/dist/providers/arxiv/translator.d.ts +17 -0
- package/dist/providers/arxiv/translator.d.ts.map +1 -0
- package/dist/providers/arxiv/translator.js +112 -0
- package/dist/providers/arxiv/translator.js.map +1 -0
- package/dist/providers/arxiv/types.d.ts +71 -0
- package/dist/providers/arxiv/types.d.ts.map +1 -0
- package/dist/providers/arxiv/types.js +17 -0
- package/dist/providers/arxiv/types.js.map +1 -0
- package/dist/providers/base/index.d.ts +16 -0
- package/dist/providers/base/index.d.ts.map +1 -0
- package/dist/providers/base/mock-provider.d.ts +76 -0
- package/dist/providers/base/mock-provider.d.ts.map +1 -0
- package/dist/providers/base/mock-provider.js +159 -0
- package/dist/providers/base/mock-provider.js.map +1 -0
- package/dist/providers/base/provider.d.ts +95 -0
- package/dist/providers/base/provider.d.ts.map +1 -0
- package/dist/providers/base/provider.js +117 -0
- package/dist/providers/base/provider.js.map +1 -0
- package/dist/providers/base/rate-limiter.d.ts +70 -0
- package/dist/providers/base/rate-limiter.d.ts.map +1 -0
- package/dist/providers/base/rate-limiter.js +111 -0
- package/dist/providers/base/rate-limiter.js.map +1 -0
- package/dist/providers/base/registry.d.ts +52 -0
- package/dist/providers/base/registry.d.ts.map +1 -0
- package/dist/providers/base/registry.js +55 -0
- package/dist/providers/base/registry.js.map +1 -0
- package/dist/providers/base/types.d.ts +163 -0
- package/dist/providers/base/types.d.ts.map +1 -0
- package/dist/providers/base/types.js +29 -0
- package/dist/providers/base/types.js.map +1 -0
- package/dist/providers/eric/client.d.ts +40 -0
- package/dist/providers/eric/client.d.ts.map +1 -0
- package/dist/providers/eric/client.js +93 -0
- package/dist/providers/eric/client.js.map +1 -0
- package/dist/providers/eric/index.d.ts +14 -0
- package/dist/providers/eric/index.d.ts.map +1 -0
- package/dist/providers/eric/parser.d.ts +21 -0
- package/dist/providers/eric/parser.d.ts.map +1 -0
- package/dist/providers/eric/parser.js +86 -0
- package/dist/providers/eric/parser.js.map +1 -0
- package/dist/providers/eric/provider.d.ts +59 -0
- package/dist/providers/eric/provider.d.ts.map +1 -0
- package/dist/providers/eric/provider.js +166 -0
- package/dist/providers/eric/provider.js.map +1 -0
- package/dist/providers/eric/translator.d.ts +12 -0
- package/dist/providers/eric/translator.d.ts.map +1 -0
- package/dist/providers/eric/translator.js +81 -0
- package/dist/providers/eric/translator.js.map +1 -0
- package/dist/providers/eric/types.d.ts +84 -0
- package/dist/providers/eric/types.d.ts.map +1 -0
- package/dist/providers/pubmed/client.d.ts +54 -0
- package/dist/providers/pubmed/client.d.ts.map +1 -0
- package/dist/providers/pubmed/client.js +141 -0
- package/dist/providers/pubmed/client.js.map +1 -0
- package/dist/providers/pubmed/index.d.ts +27 -0
- package/dist/providers/pubmed/index.d.ts.map +1 -0
- package/dist/providers/pubmed/parser.d.ts +22 -0
- package/dist/providers/pubmed/parser.d.ts.map +1 -0
- package/dist/providers/pubmed/parser.js +174 -0
- package/dist/providers/pubmed/parser.js.map +1 -0
- package/dist/providers/pubmed/provider.d.ts +44 -0
- package/dist/providers/pubmed/provider.d.ts.map +1 -0
- package/dist/providers/pubmed/provider.js +224 -0
- package/dist/providers/pubmed/provider.js.map +1 -0
- package/dist/providers/pubmed/translator.d.ts +7 -0
- package/dist/providers/pubmed/translator.d.ts.map +1 -0
- package/dist/providers/pubmed/translator.js +143 -0
- package/dist/providers/pubmed/translator.js.map +1 -0
- package/dist/providers/pubmed/types.d.ts +72 -0
- package/dist/providers/pubmed/types.d.ts.map +1 -0
- package/dist/providers/scopus/client.d.ts +64 -0
- package/dist/providers/scopus/client.d.ts.map +1 -0
- package/dist/providers/scopus/client.js +155 -0
- package/dist/providers/scopus/client.js.map +1 -0
- package/dist/providers/scopus/index.d.ts +21 -0
- package/dist/providers/scopus/index.d.ts.map +1 -0
- package/dist/providers/scopus/parser.d.ts +11 -0
- package/dist/providers/scopus/parser.d.ts.map +1 -0
- package/dist/providers/scopus/parser.js +128 -0
- package/dist/providers/scopus/parser.js.map +1 -0
- package/dist/providers/scopus/provider.d.ts +39 -0
- package/dist/providers/scopus/provider.d.ts.map +1 -0
- package/dist/providers/scopus/provider.js +175 -0
- package/dist/providers/scopus/provider.js.map +1 -0
- package/dist/providers/scopus/translator.d.ts +7 -0
- package/dist/providers/scopus/translator.d.ts.map +1 -0
- package/dist/providers/scopus/translator.js +83 -0
- package/dist/providers/scopus/translator.js.map +1 -0
- package/dist/providers/scopus/types.d.ts +86 -0
- package/dist/providers/scopus/types.d.ts.map +1 -0
- package/dist/query/index.d.ts +12 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/parser.d.ts +18 -0
- package/dist/query/parser.d.ts.map +1 -0
- package/dist/query/parser.js +16 -0
- package/dist/query/parser.js.map +1 -0
- package/dist/query/types.d.ts +85 -0
- package/dist/query/types.d.ts.map +1 -0
- package/dist/query/validator.d.ts +635 -0
- package/dist/query/validator.d.ts.map +1 -0
- package/dist/query/validator.js +117 -0
- package/dist/query/validator.js.map +1 -0
- package/dist/session/index.d.ts +14 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/logger.d.ts +15 -0
- package/dist/session/logger.d.ts.map +1 -0
- package/dist/session/logger.js +18 -0
- package/dist/session/logger.js.map +1 -0
- package/dist/session/manager.d.ts +63 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +193 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/types.d.ts +182 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/utils/deep-merge.d.ts +17 -0
- package/dist/utils/deep-merge.d.ts.map +1 -0
- package/dist/utils/deep-merge.js +23 -0
- package/dist/utils/deep-merge.js.map +1 -0
- package/dist/utils/path.d.ts +9 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +15 -0
- package/dist/utils/path.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sources":["../../src/config/loader.ts"],"sourcesContent":["import { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport { parse as parseToml, stringify as stringifyToml } from '@iarna/toml';\nimport { ConfigSchema, type Config } from './schema.js';\nimport { getDefaultConfig } from './defaults.js';\nimport { applyEnvVars } from './env.js';\nimport { getDefaultConfigPath, getDefaultSessionsDir } from './paths.js';\nimport { deepMerge, type DeepPartial } from '../utils/deep-merge.js';\nimport { expandPath } from '../utils/path.js';\n\nexport type RawConfig = Partial<Config>;\n\n/**\n * Options for loadConfig function.\n */\nexport interface LoadConfigOptions {\n /** Path to global config file (default: platform-specific via getDefaultConfigPath()) */\n globalConfigPath?: string;\n /** Path to local config file (default: ./search-hub.config.toml) */\n localConfigPath?: string;\n /** CLI options to apply (highest priority) */\n cliOptions?: DeepPartial<Config>;\n}\n\n/**\n * Load and parse a TOML config file.\n * Returns empty object if file doesn't exist.\n * Throws with clear message if TOML is invalid.\n */\nexport async function loadTomlFile(path: string): Promise<RawConfig> {\n let content: string;\n\n try {\n content = await readFile(path, 'utf-8');\n } catch (error) {\n // File doesn't exist or can't be read\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return {};\n }\n throw error;\n }\n\n // Empty file\n if (!content.trim()) {\n return {};\n }\n\n try {\n return parseToml(content) as RawConfig;\n } catch (error) {\n throw new Error(\n `Invalid TOML in ${path}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Default local config file path.\n */\nconst DEFAULT_LOCAL_CONFIG_PATH = './search-hub.config.toml';\n\n/**\n * Load configuration from all sources and merge them.\n *\n * Priority (highest to lowest):\n * 1. CLI options\n * 2. Environment variables\n * 3. Local config (./search-hub.config.toml)\n * 4. Global config (platform-specific, e.g. ~/.config/search-hub/config.toml on Linux)\n * 5. Default values\n */\nexport async function loadConfig(options: LoadConfigOptions = {}): Promise<Config> {\n const {\n globalConfigPath = getDefaultConfigPath(),\n localConfigPath = DEFAULT_LOCAL_CONFIG_PATH,\n cliOptions,\n } = options;\n\n // 1. Start with defaults\n let config = getDefaultConfig();\n\n // 2. Load and merge global config\n const expandedGlobalPath = expandPath(globalConfigPath);\n const globalConfig = await loadTomlFile(expandedGlobalPath);\n config = deepMerge(config, globalConfig as DeepPartial<Config>);\n\n // 3. Load and merge local config\n const localConfig = await loadTomlFile(localConfigPath);\n config = deepMerge(config, localConfig as DeepPartial<Config>);\n\n // 4. Apply environment variables\n config = applyEnvVars(config);\n\n // 5. Apply CLI options (if provided)\n if (cliOptions) {\n config = deepMerge(config, cliOptions);\n }\n\n // 6. Validate\n config = ConfigSchema.parse(config);\n\n // 7. Resolve empty session.directory to platform default\n if (!config.session.directory) {\n config.session.directory = getDefaultSessionsDir();\n }\n\n return config;\n}\n\n/**\n * Options for saveConfig function.\n */\nexport interface SaveConfigOptions {\n /** Path to save config file (default: platform-specific via getDefaultConfigPath()) */\n path?: string;\n /** Create directory if it doesn't exist (default: true) */\n createDir?: boolean;\n}\n\n// Re-define JsonMap type to match @iarna/toml's expected input\n// This is necessary because the library's JsonMap type is not exported\ntype TomlValue = boolean | number | string | Date | TomlMap | TomlValue[];\ninterface TomlMap {\n [key: string]: TomlValue;\n}\n\n/**\n * Save configuration to a TOML file.\n *\n * @param config - Configuration object to save\n * @param options - Save options\n * @throws Error if config is invalid or file write fails\n */\nexport async function saveConfig(\n config: Config,\n options: SaveConfigOptions = {}\n): Promise<void> {\n const {\n path = getDefaultConfigPath(),\n createDir = true,\n } = options;\n\n // Validate config before saving\n ConfigSchema.parse(config);\n\n // Expand path and ensure directory exists\n const expandedPath = expandPath(path);\n if (createDir) {\n await mkdir(dirname(expandedPath), { recursive: true });\n }\n\n // Convert to TOML and write\n // Config structure is compatible with TOML's JsonMap type\n // The cast is safe because Config only contains TOML-compatible types\n const tomlContent = stringifyToml(config as TomlMap);\n await writeFile(expandedPath, tomlContent, 'utf-8');\n}\n"],"names":["parseToml","stringifyToml"],"mappings":";;;;;;;;;AA6BA,eAAsB,aAAa,MAAkC;AACnE,MAAI;AAEJ,MAAI;AACF,cAAU,MAAM,SAAS,MAAM,OAAO;AAAA,EACxC,SAAS,OAAO;AAEd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO,CAAA;AAAA,IACT;AACA,UAAM;AAAA,EACR;AAGA,MAAI,CAAC,QAAQ,QAAQ;AACnB,WAAO,CAAA;AAAA,EACT;AAEA,MAAI;AACF,WAAOA,MAAU,OAAO;AAAA,EAC1B,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,mBAAmB,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAAA;AAAA,EAEtF;AACF;AAKA,MAAM,4BAA4B;AAYlC,eAAsB,WAAW,UAA6B,IAAqB;AACjF,QAAM;AAAA,IACJ,mBAAmB,qBAAA;AAAA,IACnB,kBAAkB;AAAA,IAClB;AAAA,EAAA,IACE;AAGJ,MAAI,SAAS,iBAAA;AAGb,QAAM,qBAAqB,WAAW,gBAAgB;AACtD,QAAM,eAAe,MAAM,aAAa,kBAAkB;AAC1D,WAAS,UAAU,QAAQ,YAAmC;AAG9D,QAAM,cAAc,MAAM,aAAa,eAAe;AACtD,WAAS,UAAU,QAAQ,WAAkC;AAG7D,WAAS,aAAa,MAAM;AAG5B,MAAI,YAAY;AACd,aAAS,UAAU,QAAQ,UAAU;AAAA,EACvC;AAGA,WAAS,aAAa,MAAM,MAAM;AAGlC,MAAI,CAAC,OAAO,QAAQ,WAAW;AAC7B,WAAO,QAAQ,YAAY,sBAAA;AAAA,EAC7B;AAEA,SAAO;AACT;AA0BA,eAAsB,WACpB,QACA,UAA6B,IACd;AACf,QAAM;AAAA,IACJ,OAAO,qBAAA;AAAA,IACP,YAAY;AAAA,EAAA,IACV;AAGJ,eAAa,MAAM,MAAM;AAGzB,QAAM,eAAe,WAAW,IAAI;AACpC,MAAI,WAAW;AACb,UAAM,MAAM,QAAQ,YAAY,GAAG,EAAE,WAAW,MAAM;AAAA,EACxD;AAKA,QAAM,cAAcC,UAAc,MAAiB;AACnD,QAAM,UAAU,cAAc,aAAa,OAAO;AACpD;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get the config directory for search-hub.
|
|
3
|
+
* - Linux: ~/.config/search-hub
|
|
4
|
+
* - macOS: ~/Library/Preferences/search-hub
|
|
5
|
+
* - Windows: %APPDATA%\search-hub\Config
|
|
6
|
+
*/
|
|
7
|
+
export declare function getConfigDir(): string;
|
|
8
|
+
/**
|
|
9
|
+
* Get the data directory for search-hub.
|
|
10
|
+
* - Linux: ~/.local/share/search-hub
|
|
11
|
+
* - macOS: ~/Library/Application Support/search-hub
|
|
12
|
+
* - Windows: %LOCALAPPDATA%\search-hub\Data
|
|
13
|
+
*/
|
|
14
|
+
export declare function getDataDir(): string;
|
|
15
|
+
/**
|
|
16
|
+
* Get the default config file path.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getDefaultConfigPath(): string;
|
|
19
|
+
/**
|
|
20
|
+
* Get the default sessions directory.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getDefaultSessionsDir(): string;
|
|
23
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAUA;;;;;GAKG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import envPaths from "../node_modules/env-paths/index.js";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
const paths = envPaths("search-hub", { suffix: "" });
|
|
4
|
+
function getConfigDir() {
|
|
5
|
+
return paths.config;
|
|
6
|
+
}
|
|
7
|
+
function getDataDir() {
|
|
8
|
+
return paths.data;
|
|
9
|
+
}
|
|
10
|
+
function getDefaultConfigPath() {
|
|
11
|
+
return join(paths.config, "config.toml");
|
|
12
|
+
}
|
|
13
|
+
function getDefaultSessionsDir() {
|
|
14
|
+
return join(paths.data, "sessions");
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
getConfigDir,
|
|
18
|
+
getDataDir,
|
|
19
|
+
getDefaultConfigPath,
|
|
20
|
+
getDefaultSessionsDir
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sources":["../../src/config/paths.ts"],"sourcesContent":["/**\n * Platform-specific paths using XDG Base Directory spec on Linux,\n * ~/Library on macOS, and AppData on Windows.\n */\nimport envPaths from 'env-paths';\nimport { join } from 'node:path';\n\n// Use empty suffix to get clean 'search-hub' directory names\nconst paths = envPaths('search-hub', { suffix: '' });\n\n/**\n * Get the config directory for search-hub.\n * - Linux: ~/.config/search-hub\n * - macOS: ~/Library/Preferences/search-hub\n * - Windows: %APPDATA%\\search-hub\\Config\n */\nexport function getConfigDir(): string {\n return paths.config;\n}\n\n/**\n * Get the data directory for search-hub.\n * - Linux: ~/.local/share/search-hub\n * - macOS: ~/Library/Application Support/search-hub\n * - Windows: %LOCALAPPDATA%\\search-hub\\Data\n */\nexport function getDataDir(): string {\n return paths.data;\n}\n\n/**\n * Get the default config file path.\n */\nexport function getDefaultConfigPath(): string {\n return join(paths.config, 'config.toml');\n}\n\n/**\n * Get the default sessions directory.\n */\nexport function getDefaultSessionsDir(): string {\n return join(paths.data, 'sessions');\n}\n"],"names":[],"mappings":";;AAQA,MAAM,QAAQ,SAAS,cAAc,EAAE,QAAQ,IAAI;AAQ5C,SAAS,eAAuB;AACrC,SAAO,MAAM;AACf;AAQO,SAAS,aAAqB;AACnC,SAAO,MAAM;AACf;AAKO,SAAS,uBAA+B;AAC7C,SAAO,KAAK,MAAM,QAAQ,aAAa;AACzC;AAKO,SAAS,wBAAgC;AAC9C,SAAO,KAAK,MAAM,MAAM,UAAU;AACpC;"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Schema for individual provider configuration.
|
|
4
|
+
* Each provider (PubMed, Scopus, etc.) has similar config options.
|
|
5
|
+
*/
|
|
6
|
+
export declare const ProviderConfigSchema: z.ZodObject<{
|
|
7
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
8
|
+
api_key: z.ZodOptional<z.ZodString>;
|
|
9
|
+
email: z.ZodOptional<z.ZodString>;
|
|
10
|
+
rate_limit: z.ZodDefault<z.ZodNumber>;
|
|
11
|
+
timeout: z.ZodDefault<z.ZodNumber>;
|
|
12
|
+
retries: z.ZodDefault<z.ZodNumber>;
|
|
13
|
+
max_results: z.ZodDefault<z.ZodNumber>;
|
|
14
|
+
inst_token: z.ZodOptional<z.ZodString>;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
export type ProviderConfig = z.infer<typeof ProviderConfigSchema>;
|
|
17
|
+
/**
|
|
18
|
+
* Main configuration schema for search-hub.
|
|
19
|
+
* All fields have defaults, so an empty object is valid input.
|
|
20
|
+
*/
|
|
21
|
+
export declare const ConfigSchema: z.ZodObject<{
|
|
22
|
+
session: z.ZodDefault<z.ZodObject<{
|
|
23
|
+
directory: z.ZodDefault<z.ZodString>;
|
|
24
|
+
}, z.core.$strip>>;
|
|
25
|
+
log: z.ZodDefault<z.ZodObject<{
|
|
26
|
+
level: z.ZodDefault<z.ZodEnum<{
|
|
27
|
+
error: "error";
|
|
28
|
+
debug: "debug";
|
|
29
|
+
info: "info";
|
|
30
|
+
warn: "warn";
|
|
31
|
+
}>>;
|
|
32
|
+
}, z.core.$strip>>;
|
|
33
|
+
output: z.ZodDefault<z.ZodObject<{
|
|
34
|
+
color: z.ZodDefault<z.ZodBoolean>;
|
|
35
|
+
progress_bar: z.ZodDefault<z.ZodBoolean>;
|
|
36
|
+
}, z.core.$strip>>;
|
|
37
|
+
providers: z.ZodDefault<z.ZodObject<{
|
|
38
|
+
pubmed: z.ZodDefault<z.ZodObject<{
|
|
39
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
40
|
+
api_key: z.ZodOptional<z.ZodString>;
|
|
41
|
+
email: z.ZodOptional<z.ZodString>;
|
|
42
|
+
rate_limit: z.ZodDefault<z.ZodNumber>;
|
|
43
|
+
timeout: z.ZodDefault<z.ZodNumber>;
|
|
44
|
+
retries: z.ZodDefault<z.ZodNumber>;
|
|
45
|
+
max_results: z.ZodDefault<z.ZodNumber>;
|
|
46
|
+
inst_token: z.ZodOptional<z.ZodString>;
|
|
47
|
+
}, z.core.$strip>>;
|
|
48
|
+
eric: z.ZodDefault<z.ZodObject<{
|
|
49
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
50
|
+
api_key: z.ZodOptional<z.ZodString>;
|
|
51
|
+
email: z.ZodOptional<z.ZodString>;
|
|
52
|
+
rate_limit: z.ZodDefault<z.ZodNumber>;
|
|
53
|
+
timeout: z.ZodDefault<z.ZodNumber>;
|
|
54
|
+
retries: z.ZodDefault<z.ZodNumber>;
|
|
55
|
+
max_results: z.ZodDefault<z.ZodNumber>;
|
|
56
|
+
inst_token: z.ZodOptional<z.ZodString>;
|
|
57
|
+
}, z.core.$strip>>;
|
|
58
|
+
arxiv: z.ZodDefault<z.ZodObject<{
|
|
59
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
60
|
+
api_key: z.ZodOptional<z.ZodString>;
|
|
61
|
+
email: z.ZodOptional<z.ZodString>;
|
|
62
|
+
rate_limit: z.ZodDefault<z.ZodNumber>;
|
|
63
|
+
timeout: z.ZodDefault<z.ZodNumber>;
|
|
64
|
+
retries: z.ZodDefault<z.ZodNumber>;
|
|
65
|
+
max_results: z.ZodDefault<z.ZodNumber>;
|
|
66
|
+
inst_token: z.ZodOptional<z.ZodString>;
|
|
67
|
+
}, z.core.$strip>>;
|
|
68
|
+
scopus: z.ZodDefault<z.ZodObject<{
|
|
69
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
70
|
+
api_key: z.ZodOptional<z.ZodString>;
|
|
71
|
+
email: z.ZodOptional<z.ZodString>;
|
|
72
|
+
rate_limit: z.ZodDefault<z.ZodNumber>;
|
|
73
|
+
timeout: z.ZodDefault<z.ZodNumber>;
|
|
74
|
+
retries: z.ZodDefault<z.ZodNumber>;
|
|
75
|
+
max_results: z.ZodDefault<z.ZodNumber>;
|
|
76
|
+
inst_token: z.ZodOptional<z.ZodString>;
|
|
77
|
+
}, z.core.$strip>>;
|
|
78
|
+
wos: z.ZodDefault<z.ZodObject<{
|
|
79
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
80
|
+
api_key: z.ZodOptional<z.ZodString>;
|
|
81
|
+
email: z.ZodOptional<z.ZodString>;
|
|
82
|
+
rate_limit: z.ZodDefault<z.ZodNumber>;
|
|
83
|
+
timeout: z.ZodDefault<z.ZodNumber>;
|
|
84
|
+
retries: z.ZodDefault<z.ZodNumber>;
|
|
85
|
+
max_results: z.ZodDefault<z.ZodNumber>;
|
|
86
|
+
inst_token: z.ZodOptional<z.ZodString>;
|
|
87
|
+
}, z.core.$strip>>;
|
|
88
|
+
embase: z.ZodDefault<z.ZodObject<{
|
|
89
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
90
|
+
api_key: z.ZodOptional<z.ZodString>;
|
|
91
|
+
email: z.ZodOptional<z.ZodString>;
|
|
92
|
+
rate_limit: z.ZodDefault<z.ZodNumber>;
|
|
93
|
+
timeout: z.ZodDefault<z.ZodNumber>;
|
|
94
|
+
retries: z.ZodDefault<z.ZodNumber>;
|
|
95
|
+
max_results: z.ZodDefault<z.ZodNumber>;
|
|
96
|
+
inst_token: z.ZodOptional<z.ZodString>;
|
|
97
|
+
}, z.core.$strip>>;
|
|
98
|
+
}, z.core.$strip>>;
|
|
99
|
+
integration: z.ZodDefault<z.ZodObject<{
|
|
100
|
+
reference_manager: z.ZodDefault<z.ZodObject<{
|
|
101
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
102
|
+
command: z.ZodDefault<z.ZodString>;
|
|
103
|
+
auto_register: z.ZodDefault<z.ZodBoolean>;
|
|
104
|
+
with_abstracts: z.ZodDefault<z.ZodBoolean>;
|
|
105
|
+
}, z.core.$strip>>;
|
|
106
|
+
}, z.core.$strip>>;
|
|
107
|
+
}, z.core.$strip>;
|
|
108
|
+
export type Config = z.infer<typeof ConfigSchema>;
|
|
109
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;iBAS/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AASlE;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+DvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const PROVIDER_DEFAULTS = {
|
|
3
|
+
enabled: true,
|
|
4
|
+
rate_limit: 3,
|
|
5
|
+
timeout: 3e4,
|
|
6
|
+
retries: 3,
|
|
7
|
+
max_results: 1e4
|
|
8
|
+
};
|
|
9
|
+
const ProviderConfigSchema = z.object({
|
|
10
|
+
enabled: z.boolean().default(PROVIDER_DEFAULTS.enabled),
|
|
11
|
+
api_key: z.string().optional(),
|
|
12
|
+
email: z.string().email().optional(),
|
|
13
|
+
rate_limit: z.number().positive().default(PROVIDER_DEFAULTS.rate_limit),
|
|
14
|
+
timeout: z.number().positive().default(PROVIDER_DEFAULTS.timeout),
|
|
15
|
+
retries: z.number().int().min(0).default(PROVIDER_DEFAULTS.retries),
|
|
16
|
+
max_results: z.number().int().positive().default(PROVIDER_DEFAULTS.max_results),
|
|
17
|
+
inst_token: z.string().optional()
|
|
18
|
+
});
|
|
19
|
+
function getDefaultProviderConfig() {
|
|
20
|
+
return ProviderConfigSchema.parse({});
|
|
21
|
+
}
|
|
22
|
+
const ConfigSchema = z.object({
|
|
23
|
+
session: z.object({
|
|
24
|
+
// Empty string means use platform default (resolved in loader.ts)
|
|
25
|
+
directory: z.string().default("")
|
|
26
|
+
}).default(() => ({ directory: "" })),
|
|
27
|
+
log: z.object({
|
|
28
|
+
level: z.enum(["debug", "info", "warn", "error"]).default("info")
|
|
29
|
+
}).default(() => ({ level: "info" })),
|
|
30
|
+
output: z.object({
|
|
31
|
+
color: z.boolean().default(true),
|
|
32
|
+
progress_bar: z.boolean().default(true)
|
|
33
|
+
}).default(() => ({ color: true, progress_bar: true })),
|
|
34
|
+
providers: z.object({
|
|
35
|
+
pubmed: ProviderConfigSchema.default(getDefaultProviderConfig),
|
|
36
|
+
eric: ProviderConfigSchema.default(getDefaultProviderConfig),
|
|
37
|
+
arxiv: ProviderConfigSchema.default(getDefaultProviderConfig),
|
|
38
|
+
scopus: ProviderConfigSchema.default(getDefaultProviderConfig),
|
|
39
|
+
wos: ProviderConfigSchema.default(getDefaultProviderConfig),
|
|
40
|
+
embase: ProviderConfigSchema.default(getDefaultProviderConfig)
|
|
41
|
+
}).default(() => ({
|
|
42
|
+
pubmed: getDefaultProviderConfig(),
|
|
43
|
+
eric: getDefaultProviderConfig(),
|
|
44
|
+
arxiv: getDefaultProviderConfig(),
|
|
45
|
+
scopus: getDefaultProviderConfig(),
|
|
46
|
+
wos: getDefaultProviderConfig(),
|
|
47
|
+
embase: getDefaultProviderConfig()
|
|
48
|
+
})),
|
|
49
|
+
integration: z.object({
|
|
50
|
+
reference_manager: z.object({
|
|
51
|
+
enabled: z.boolean().default(true),
|
|
52
|
+
command: z.string().default("ref"),
|
|
53
|
+
auto_register: z.boolean().default(false),
|
|
54
|
+
with_abstracts: z.boolean().default(false)
|
|
55
|
+
}).default(() => ({
|
|
56
|
+
enabled: true,
|
|
57
|
+
command: "ref",
|
|
58
|
+
auto_register: false,
|
|
59
|
+
with_abstracts: false
|
|
60
|
+
}))
|
|
61
|
+
}).default(() => ({
|
|
62
|
+
reference_manager: {
|
|
63
|
+
enabled: true,
|
|
64
|
+
command: "ref",
|
|
65
|
+
auto_register: false,
|
|
66
|
+
with_abstracts: false
|
|
67
|
+
}
|
|
68
|
+
}))
|
|
69
|
+
});
|
|
70
|
+
export {
|
|
71
|
+
ConfigSchema,
|
|
72
|
+
ProviderConfigSchema
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sources":["../../src/config/schema.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * Default values for provider configuration.\n */\nconst PROVIDER_DEFAULTS = {\n enabled: true,\n rate_limit: 3,\n timeout: 30000,\n retries: 3,\n max_results: 10000,\n} as const;\n\n/**\n * Schema for individual provider configuration.\n * Each provider (PubMed, Scopus, etc.) has similar config options.\n */\nexport const ProviderConfigSchema = z.object({\n enabled: z.boolean().default(PROVIDER_DEFAULTS.enabled),\n api_key: z.string().optional(),\n email: z.string().email().optional(),\n rate_limit: z.number().positive().default(PROVIDER_DEFAULTS.rate_limit),\n timeout: z.number().positive().default(PROVIDER_DEFAULTS.timeout),\n retries: z.number().int().min(0).default(PROVIDER_DEFAULTS.retries),\n max_results: z.number().int().positive().default(PROVIDER_DEFAULTS.max_results),\n inst_token: z.string().optional(),\n});\n\nexport type ProviderConfig = z.infer<typeof ProviderConfigSchema>;\n\n/**\n * Get default provider config object.\n */\nfunction getDefaultProviderConfig(): ProviderConfig {\n return ProviderConfigSchema.parse({});\n}\n\n/**\n * Main configuration schema for search-hub.\n * All fields have defaults, so an empty object is valid input.\n */\nexport const ConfigSchema = z.object({\n session: z\n .object({\n // Empty string means use platform default (resolved in loader.ts)\n directory: z.string().default(''),\n })\n .default(() => ({ directory: '' })),\n\n log: z\n .object({\n level: z.enum(['debug', 'info', 'warn', 'error']).default('info'),\n })\n .default(() => ({ level: 'info' as const })),\n\n output: z\n .object({\n color: z.boolean().default(true),\n progress_bar: z.boolean().default(true),\n })\n .default(() => ({ color: true, progress_bar: true })),\n\n providers: z\n .object({\n pubmed: ProviderConfigSchema.default(getDefaultProviderConfig),\n eric: ProviderConfigSchema.default(getDefaultProviderConfig),\n arxiv: ProviderConfigSchema.default(getDefaultProviderConfig),\n scopus: ProviderConfigSchema.default(getDefaultProviderConfig),\n wos: ProviderConfigSchema.default(getDefaultProviderConfig),\n embase: ProviderConfigSchema.default(getDefaultProviderConfig),\n })\n .default(() => ({\n pubmed: getDefaultProviderConfig(),\n eric: getDefaultProviderConfig(),\n arxiv: getDefaultProviderConfig(),\n scopus: getDefaultProviderConfig(),\n wos: getDefaultProviderConfig(),\n embase: getDefaultProviderConfig(),\n })),\n\n integration: z\n .object({\n reference_manager: z\n .object({\n enabled: z.boolean().default(true),\n command: z.string().default('ref'),\n auto_register: z.boolean().default(false),\n with_abstracts: z.boolean().default(false),\n })\n .default(() => ({\n enabled: true,\n command: 'ref',\n auto_register: false,\n with_abstracts: false,\n })),\n })\n .default(() => ({\n reference_manager: {\n enabled: true,\n command: 'ref',\n auto_register: false,\n with_abstracts: false,\n },\n })),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\n"],"names":[],"mappings":";AAKA,MAAM,oBAAoB;AAAA,EACxB,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,SAAS;AAAA,EACT,aAAa;AACf;AAMO,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,SAAS,EAAE,QAAA,EAAU,QAAQ,kBAAkB,OAAO;AAAA,EACtD,SAAS,EAAE,OAAA,EAAS,SAAA;AAAA,EACpB,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAA;AAAA,EAC1B,YAAY,EAAE,OAAA,EAAS,WAAW,QAAQ,kBAAkB,UAAU;AAAA,EACtE,SAAS,EAAE,OAAA,EAAS,WAAW,QAAQ,kBAAkB,OAAO;AAAA,EAChE,SAAS,EAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,QAAQ,kBAAkB,OAAO;AAAA,EAClE,aAAa,EAAE,OAAA,EAAS,IAAA,EAAM,WAAW,QAAQ,kBAAkB,WAAW;AAAA,EAC9E,YAAY,EAAE,OAAA,EAAS,SAAA;AACzB,CAAC;AAOD,SAAS,2BAA2C;AAClD,SAAO,qBAAqB,MAAM,EAAE;AACtC;AAMO,MAAM,eAAe,EAAE,OAAO;AAAA,EACnC,SAAS,EACN,OAAO;AAAA;AAAA,IAEN,WAAW,EAAE,OAAA,EAAS,QAAQ,EAAE;AAAA,EAAA,CACjC,EACA,QAAQ,OAAO,EAAE,WAAW,KAAK;AAAA,EAEpC,KAAK,EACF,OAAO;AAAA,IACN,OAAO,EAAE,KAAK,CAAC,SAAS,QAAQ,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,EAAA,CACjE,EACA,QAAQ,OAAO,EAAE,OAAO,SAAkB;AAAA,EAE7C,QAAQ,EACL,OAAO;AAAA,IACN,OAAO,EAAE,UAAU,QAAQ,IAAI;AAAA,IAC/B,cAAc,EAAE,QAAA,EAAU,QAAQ,IAAI;AAAA,EAAA,CACvC,EACA,QAAQ,OAAO,EAAE,OAAO,MAAM,cAAc,KAAA,EAAO;AAAA,EAEtD,WAAW,EACR,OAAO;AAAA,IACN,QAAQ,qBAAqB,QAAQ,wBAAwB;AAAA,IAC7D,MAAM,qBAAqB,QAAQ,wBAAwB;AAAA,IAC3D,OAAO,qBAAqB,QAAQ,wBAAwB;AAAA,IAC5D,QAAQ,qBAAqB,QAAQ,wBAAwB;AAAA,IAC7D,KAAK,qBAAqB,QAAQ,wBAAwB;AAAA,IAC1D,QAAQ,qBAAqB,QAAQ,wBAAwB;AAAA,EAAA,CAC9D,EACA,QAAQ,OAAO;AAAA,IACd,QAAQ,yBAAA;AAAA,IACR,MAAM,yBAAA;AAAA,IACN,OAAO,yBAAA;AAAA,IACP,QAAQ,yBAAA;AAAA,IACR,KAAK,yBAAA;AAAA,IACL,QAAQ,yBAAA;AAAA,EAAyB,EACjC;AAAA,EAEJ,aAAa,EACV,OAAO;AAAA,IACN,mBAAmB,EAChB,OAAO;AAAA,MACN,SAAS,EAAE,UAAU,QAAQ,IAAI;AAAA,MACjC,SAAS,EAAE,SAAS,QAAQ,KAAK;AAAA,MACjC,eAAe,EAAE,UAAU,QAAQ,KAAK;AAAA,MACxC,gBAAgB,EAAE,QAAA,EAAU,QAAQ,KAAK;AAAA,IAAA,CAC1C,EACA,QAAQ,OAAO;AAAA,MACd,SAAS;AAAA,MACT,SAAS;AAAA,MACT,eAAe;AAAA,MACf,gBAAgB;AAAA,IAAA,EAChB;AAAA,EAAA,CACL,EACA,QAAQ,OAAO;AAAA,IACd,mBAAmB;AAAA,MACjB,SAAS;AAAA,MACT,SAAS;AAAA,MACT,eAAe;AAAA,MACf,gBAAgB;AAAA,IAAA;AAAA,EAClB,EACA;AACN,CAAC;"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* search-hub library exports
|
|
3
|
+
*
|
|
4
|
+
* This module provides programmatic access to search-hub functionality
|
|
5
|
+
* for use as a library in other projects.
|
|
6
|
+
*/
|
|
7
|
+
export * from './query/index.js';
|
|
8
|
+
export * from './config/index.js';
|
|
9
|
+
export * from './session/index.js';
|
|
10
|
+
export * from './providers/base/index.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,kBAAkB,CAAC;AAGjC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,oBAAoB,CAAC;AAGnC,cAAc,2BAA2B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { parseQueryFile, parseQueryString } from "./query/parser.js";
|
|
2
|
+
import { ValidationError, fieldTypeSchema, filtersSchema, formatValidationErrors, overrideBlockSchema, queryBlockSchema, queryFileSchema, termBlockSchema, validateQueryFile } from "./query/validator.js";
|
|
3
|
+
import { loadConfig, saveConfig } from "./config/loader.js";
|
|
4
|
+
import { ConfigSchema } from "./config/schema.js";
|
|
5
|
+
import { DEFAULT_CONFIG, getDefaultConfig } from "./config/defaults.js";
|
|
6
|
+
import { createSession, generateSessionId, getResumableProviders, listSessions, loadSession, sanitizeName, saveSession, sessionExists, updateDatabaseStatus, updateSessionStatus } from "./session/manager.js";
|
|
7
|
+
import { SessionLogger } from "./session/logger.js";
|
|
8
|
+
import { createProviderError, isAuthError, isProviderError, isRateLimitError } from "./providers/base/types.js";
|
|
9
|
+
import { BaseProvider, deserializeState, serializeState } from "./providers/base/provider.js";
|
|
10
|
+
import { RateLimiter } from "./providers/base/rate-limiter.js";
|
|
11
|
+
import { ProviderRegistry, createProviderRegistry, globalRegistry } from "./providers/base/registry.js";
|
|
12
|
+
import { MockProvider } from "./providers/base/mock-provider.js";
|
|
13
|
+
export {
|
|
14
|
+
BaseProvider,
|
|
15
|
+
ConfigSchema,
|
|
16
|
+
DEFAULT_CONFIG,
|
|
17
|
+
MockProvider,
|
|
18
|
+
ProviderRegistry,
|
|
19
|
+
RateLimiter,
|
|
20
|
+
SessionLogger,
|
|
21
|
+
ValidationError,
|
|
22
|
+
createProviderError,
|
|
23
|
+
createProviderRegistry,
|
|
24
|
+
createSession,
|
|
25
|
+
deserializeState,
|
|
26
|
+
fieldTypeSchema,
|
|
27
|
+
filtersSchema,
|
|
28
|
+
formatValidationErrors,
|
|
29
|
+
generateSessionId,
|
|
30
|
+
getDefaultConfig,
|
|
31
|
+
getResumableProviders,
|
|
32
|
+
globalRegistry,
|
|
33
|
+
isAuthError,
|
|
34
|
+
isProviderError,
|
|
35
|
+
isRateLimitError,
|
|
36
|
+
listSessions,
|
|
37
|
+
loadConfig,
|
|
38
|
+
loadSession,
|
|
39
|
+
overrideBlockSchema,
|
|
40
|
+
parseQueryFile,
|
|
41
|
+
parseQueryString,
|
|
42
|
+
queryBlockSchema,
|
|
43
|
+
queryFileSchema,
|
|
44
|
+
sanitizeName,
|
|
45
|
+
saveConfig,
|
|
46
|
+
saveSession,
|
|
47
|
+
serializeState,
|
|
48
|
+
sessionExists,
|
|
49
|
+
termBlockSchema,
|
|
50
|
+
updateDatabaseStatus,
|
|
51
|
+
updateSessionStatus,
|
|
52
|
+
validateQueryFile
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { RefAddOutput } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Error thrown by ref CLI operations.
|
|
4
|
+
*/
|
|
5
|
+
export declare class RefCliError extends Error {
|
|
6
|
+
readonly code: string;
|
|
7
|
+
cause: Error | undefined;
|
|
8
|
+
constructor(message: string, code: string, cause?: Error);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Check if the ref command is available.
|
|
12
|
+
*/
|
|
13
|
+
export declare function checkRefAvailable(): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Check if npm is available.
|
|
16
|
+
*/
|
|
17
|
+
export declare function checkNpmAvailable(): Promise<boolean>;
|
|
18
|
+
/**
|
|
19
|
+
* Install reference-manager globally via npm.
|
|
20
|
+
*/
|
|
21
|
+
export declare function installRefManager(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Options for ref CLI commands.
|
|
24
|
+
*/
|
|
25
|
+
export interface RefCliOptions {
|
|
26
|
+
/** Path to the library file (uses --library option) */
|
|
27
|
+
libraryPath?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Execute ref add command and return parsed output.
|
|
31
|
+
*/
|
|
32
|
+
export declare function refAdd(id: string, options?: RefCliOptions): Promise<RefAddOutput>;
|
|
33
|
+
/**
|
|
34
|
+
* Execute ref update command to update a field.
|
|
35
|
+
*/
|
|
36
|
+
export declare function refUpdate(id: string, field: string, value: string, options?: RefCliOptions): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Execute ref export command and return the entry data.
|
|
39
|
+
*/
|
|
40
|
+
export declare function refExport(id: string, options?: RefCliOptions): Promise<unknown>;
|
|
41
|
+
//# sourceMappingURL=ref-cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ref-cli.d.ts","sourceRoot":"","sources":["../../src/integration/ref-cli.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnE;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK;aAKlB,IAAI,EAAE,MAAM;IAJrB,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;gBAGhC,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EAC5B,KAAK,CAAC,EAAE,KAAK;CAMhB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAM1D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAM1D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAcvD;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAkBD;;GAEG;AACH,wBAAsB,MAAM,CAC1B,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,YAAY,CAAC,CA6BvB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,OAAO,CAAC,CA4BlB"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { exec } from "node:child_process";
|
|
2
|
+
import { RefAddOutputSchema } from "./types.js";
|
|
3
|
+
class RefCliError extends Error {
|
|
4
|
+
constructor(message, code, cause) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.name = "RefCliError";
|
|
8
|
+
this.cause = cause;
|
|
9
|
+
}
|
|
10
|
+
cause;
|
|
11
|
+
}
|
|
12
|
+
async function checkRefAvailable() {
|
|
13
|
+
return new Promise((resolve) => {
|
|
14
|
+
exec("ref --version", (error) => {
|
|
15
|
+
resolve(!error);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
async function checkNpmAvailable() {
|
|
20
|
+
return new Promise((resolve) => {
|
|
21
|
+
exec("npm --version", (error) => {
|
|
22
|
+
resolve(!error);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async function installRefManager() {
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
exec("npm i -g @ncukondo/reference-manager", (error, stdout, stderr) => {
|
|
29
|
+
if (error) {
|
|
30
|
+
reject(new RefCliError(
|
|
31
|
+
`Failed to install reference-manager: ${stderr || error.message}`,
|
|
32
|
+
"INSTALL_FAILED",
|
|
33
|
+
error
|
|
34
|
+
));
|
|
35
|
+
} else {
|
|
36
|
+
resolve();
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function escapeShellArg(arg) {
|
|
42
|
+
return arg.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
43
|
+
}
|
|
44
|
+
function buildLibraryOption(libraryPath) {
|
|
45
|
+
if (!libraryPath) return "";
|
|
46
|
+
return `--library "${escapeShellArg(libraryPath)}" `;
|
|
47
|
+
}
|
|
48
|
+
async function refAdd(id, options) {
|
|
49
|
+
const escapedId = escapeShellArg(id);
|
|
50
|
+
const libraryOpt = buildLibraryOption(options?.libraryPath);
|
|
51
|
+
const cmd = `ref ${libraryOpt}add "${escapedId}" -o json`;
|
|
52
|
+
return new Promise((resolve, reject) => {
|
|
53
|
+
exec(cmd, (error, stdout, stderr) => {
|
|
54
|
+
if (error) {
|
|
55
|
+
reject(new RefCliError(
|
|
56
|
+
`ref add failed: ${stderr || error.message}`,
|
|
57
|
+
"REF_ADD_FAILED",
|
|
58
|
+
error
|
|
59
|
+
));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const parsed = JSON.parse(stdout);
|
|
64
|
+
const validated = RefAddOutputSchema.parse(parsed);
|
|
65
|
+
resolve(validated);
|
|
66
|
+
} catch (parseError) {
|
|
67
|
+
reject(new RefCliError(
|
|
68
|
+
`Failed to parse ref add output: ${parseError instanceof Error ? parseError.message : "Unknown error"}`,
|
|
69
|
+
"PARSE_ERROR",
|
|
70
|
+
parseError instanceof Error ? parseError : void 0
|
|
71
|
+
));
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
async function refUpdate(id, field, value, options) {
|
|
77
|
+
const escapedId = escapeShellArg(id);
|
|
78
|
+
const escapedField = escapeShellArg(field);
|
|
79
|
+
const escapedValue = escapeShellArg(value);
|
|
80
|
+
const libraryOpt = buildLibraryOption(options?.libraryPath);
|
|
81
|
+
const cmd = `ref ${libraryOpt}update "${escapedId}" --set "${escapedField}=${escapedValue}"`;
|
|
82
|
+
return new Promise((resolve, reject) => {
|
|
83
|
+
exec(cmd, (error, stdout, stderr) => {
|
|
84
|
+
if (error) {
|
|
85
|
+
reject(new RefCliError(
|
|
86
|
+
`ref update failed: ${stderr || error.message}`,
|
|
87
|
+
"REF_UPDATE_FAILED",
|
|
88
|
+
error
|
|
89
|
+
));
|
|
90
|
+
} else {
|
|
91
|
+
resolve();
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
async function refExport(id, options) {
|
|
97
|
+
const escapedId = escapeShellArg(id);
|
|
98
|
+
const libraryOpt = buildLibraryOption(options?.libraryPath);
|
|
99
|
+
const cmd = `ref ${libraryOpt}export "${escapedId}"`;
|
|
100
|
+
return new Promise((resolve, reject) => {
|
|
101
|
+
exec(cmd, (error, stdout, stderr) => {
|
|
102
|
+
if (error) {
|
|
103
|
+
reject(new RefCliError(
|
|
104
|
+
`ref export failed: ${stderr || error.message}`,
|
|
105
|
+
"REF_EXPORT_FAILED",
|
|
106
|
+
error
|
|
107
|
+
));
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const parsed = JSON.parse(stdout);
|
|
112
|
+
resolve(parsed);
|
|
113
|
+
} catch (parseError) {
|
|
114
|
+
reject(new RefCliError(
|
|
115
|
+
`Failed to parse ref export output: ${parseError instanceof Error ? parseError.message : "Unknown error"}`,
|
|
116
|
+
"PARSE_ERROR",
|
|
117
|
+
parseError instanceof Error ? parseError : void 0
|
|
118
|
+
));
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
export {
|
|
124
|
+
RefCliError,
|
|
125
|
+
checkNpmAvailable,
|
|
126
|
+
checkRefAvailable,
|
|
127
|
+
installRefManager,
|
|
128
|
+
refAdd,
|
|
129
|
+
refExport,
|
|
130
|
+
refUpdate
|
|
131
|
+
};
|
|
132
|
+
//# sourceMappingURL=ref-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ref-cli.js","sources":["../../src/integration/ref-cli.ts"],"sourcesContent":["/**\n * ref CLI wrapper for reference-manager integration.\n * Provides functions to interact with the reference-manager CLI.\n */\n\nimport { exec } from 'node:child_process';\nimport { RefAddOutputSchema, type RefAddOutput } from './types.js';\n\n/**\n * Error thrown by ref CLI operations.\n */\nexport class RefCliError extends Error {\n override cause: Error | undefined;\n\n constructor(\n message: string,\n public readonly code: string,\n cause?: Error\n ) {\n super(message);\n this.name = 'RefCliError';\n this.cause = cause;\n }\n}\n\n/**\n * Check if the ref command is available.\n */\nexport async function checkRefAvailable(): Promise<boolean> {\n return new Promise((resolve) => {\n exec('ref --version', (error) => {\n resolve(!error);\n });\n });\n}\n\n/**\n * Check if npm is available.\n */\nexport async function checkNpmAvailable(): Promise<boolean> {\n return new Promise((resolve) => {\n exec('npm --version', (error) => {\n resolve(!error);\n });\n });\n}\n\n/**\n * Install reference-manager globally via npm.\n */\nexport async function installRefManager(): Promise<void> {\n return new Promise((resolve, reject) => {\n exec('npm i -g @ncukondo/reference-manager', (error, stdout, stderr) => {\n if (error) {\n reject(new RefCliError(\n `Failed to install reference-manager: ${stderr || error.message}`,\n 'INSTALL_FAILED',\n error\n ));\n } else {\n resolve();\n }\n });\n });\n}\n\n/**\n * Options for ref CLI commands.\n */\nexport interface RefCliOptions {\n /** Path to the library file (uses --library option) */\n libraryPath?: string;\n}\n\n/**\n * Escape a string for use in shell command.\n */\nfunction escapeShellArg(arg: string): string {\n // Escape double quotes and backslashes\n return arg.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n}\n\n/**\n * Build library option string for ref commands.\n */\nfunction buildLibraryOption(libraryPath?: string): string {\n if (!libraryPath) return '';\n return `--library \"${escapeShellArg(libraryPath)}\" `;\n}\n\n/**\n * Execute ref add command and return parsed output.\n */\nexport async function refAdd(\n id: string,\n options?: RefCliOptions\n): Promise<RefAddOutput> {\n const escapedId = escapeShellArg(id);\n const libraryOpt = buildLibraryOption(options?.libraryPath);\n const cmd = `ref ${libraryOpt}add \"${escapedId}\" -o json`;\n\n return new Promise((resolve, reject) => {\n exec(cmd, (error, stdout, stderr) => {\n if (error) {\n reject(new RefCliError(\n `ref add failed: ${stderr || error.message}`,\n 'REF_ADD_FAILED',\n error\n ));\n return;\n }\n\n try {\n const parsed = JSON.parse(stdout);\n const validated = RefAddOutputSchema.parse(parsed);\n resolve(validated);\n } catch (parseError) {\n reject(new RefCliError(\n `Failed to parse ref add output: ${parseError instanceof Error ? parseError.message : 'Unknown error'}`,\n 'PARSE_ERROR',\n parseError instanceof Error ? parseError : undefined\n ));\n }\n });\n });\n}\n\n/**\n * Execute ref update command to update a field.\n */\nexport async function refUpdate(\n id: string,\n field: string,\n value: string,\n options?: RefCliOptions\n): Promise<void> {\n const escapedId = escapeShellArg(id);\n const escapedField = escapeShellArg(field);\n const escapedValue = escapeShellArg(value);\n const libraryOpt = buildLibraryOption(options?.libraryPath);\n const cmd = `ref ${libraryOpt}update \"${escapedId}\" --set \"${escapedField}=${escapedValue}\"`;\n\n return new Promise((resolve, reject) => {\n exec(cmd, (error, stdout, stderr) => {\n if (error) {\n reject(new RefCliError(\n `ref update failed: ${stderr || error.message}`,\n 'REF_UPDATE_FAILED',\n error\n ));\n } else {\n resolve();\n }\n });\n });\n}\n\n/**\n * Execute ref export command and return the entry data.\n */\nexport async function refExport(\n id: string,\n options?: RefCliOptions\n): Promise<unknown> {\n const escapedId = escapeShellArg(id);\n const libraryOpt = buildLibraryOption(options?.libraryPath);\n const cmd = `ref ${libraryOpt}export \"${escapedId}\"`;\n\n return new Promise((resolve, reject) => {\n exec(cmd, (error, stdout, stderr) => {\n if (error) {\n reject(new RefCliError(\n `ref export failed: ${stderr || error.message}`,\n 'REF_EXPORT_FAILED',\n error\n ));\n return;\n }\n\n try {\n const parsed = JSON.parse(stdout);\n resolve(parsed);\n } catch (parseError) {\n reject(new RefCliError(\n `Failed to parse ref export output: ${parseError instanceof Error ? parseError.message : 'Unknown error'}`,\n 'PARSE_ERROR',\n parseError instanceof Error ? parseError : undefined\n ));\n }\n });\n });\n}\n"],"names":[],"mappings":";;AAWO,MAAM,oBAAoB,MAAM;AAAA,EAGrC,YACE,SACgB,MAChB,OACA;AACA,UAAM,OAAO;AAHG,SAAA,OAAA;AAIhB,SAAK,OAAO;AACZ,SAAK,QAAQ;AAAA,EACf;AAAA,EAVS;AAWX;AAKA,eAAsB,oBAAsC;AAC1D,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,SAAK,iBAAiB,CAAC,UAAU;AAC/B,cAAQ,CAAC,KAAK;AAAA,IAChB,CAAC;AAAA,EACH,CAAC;AACH;AAKA,eAAsB,oBAAsC;AAC1D,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,SAAK,iBAAiB,CAAC,UAAU;AAC/B,cAAQ,CAAC,KAAK;AAAA,IAChB,CAAC;AAAA,EACH,CAAC;AACH;AAKA,eAAsB,oBAAmC;AACvD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,SAAK,wCAAwC,CAAC,OAAO,QAAQ,WAAW;AACtE,UAAI,OAAO;AACT,eAAO,IAAI;AAAA,UACT,wCAAwC,UAAU,MAAM,OAAO;AAAA,UAC/D;AAAA,UACA;AAAA,QAAA,CACD;AAAA,MACH,OAAO;AACL,gBAAA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAaA,SAAS,eAAe,KAAqB;AAE3C,SAAO,IAAI,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK;AACvD;AAKA,SAAS,mBAAmB,aAA8B;AACxD,MAAI,CAAC,YAAa,QAAO;AACzB,SAAO,cAAc,eAAe,WAAW,CAAC;AAClD;AAKA,eAAsB,OACpB,IACA,SACuB;AACvB,QAAM,YAAY,eAAe,EAAE;AACnC,QAAM,aAAa,mBAAmB,SAAS,WAAW;AAC1D,QAAM,MAAM,OAAO,UAAU,QAAQ,SAAS;AAE9C,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,SAAK,KAAK,CAAC,OAAO,QAAQ,WAAW;AACnC,UAAI,OAAO;AACT,eAAO,IAAI;AAAA,UACT,mBAAmB,UAAU,MAAM,OAAO;AAAA,UAC1C;AAAA,UACA;AAAA,QAAA,CACD;AACD;AAAA,MACF;AAEA,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,MAAM;AAChC,cAAM,YAAY,mBAAmB,MAAM,MAAM;AACjD,gBAAQ,SAAS;AAAA,MACnB,SAAS,YAAY;AACnB,eAAO,IAAI;AAAA,UACT,mCAAmC,sBAAsB,QAAQ,WAAW,UAAU,eAAe;AAAA,UACrG;AAAA,UACA,sBAAsB,QAAQ,aAAa;AAAA,QAAA,CAC5C;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAKA,eAAsB,UACpB,IACA,OACA,OACA,SACe;AACf,QAAM,YAAY,eAAe,EAAE;AACnC,QAAM,eAAe,eAAe,KAAK;AACzC,QAAM,eAAe,eAAe,KAAK;AACzC,QAAM,aAAa,mBAAmB,SAAS,WAAW;AAC1D,QAAM,MAAM,OAAO,UAAU,WAAW,SAAS,YAAY,YAAY,IAAI,YAAY;AAEzF,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,SAAK,KAAK,CAAC,OAAO,QAAQ,WAAW;AACnC,UAAI,OAAO;AACT,eAAO,IAAI;AAAA,UACT,sBAAsB,UAAU,MAAM,OAAO;AAAA,UAC7C;AAAA,UACA;AAAA,QAAA,CACD;AAAA,MACH,OAAO;AACL,gBAAA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAKA,eAAsB,UACpB,IACA,SACkB;AAClB,QAAM,YAAY,eAAe,EAAE;AACnC,QAAM,aAAa,mBAAmB,SAAS,WAAW;AAC1D,QAAM,MAAM,OAAO,UAAU,WAAW,SAAS;AAEjD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,SAAK,KAAK,CAAC,OAAO,QAAQ,WAAW;AACnC,UAAI,OAAO;AACT,eAAO,IAAI;AAAA,UACT,sBAAsB,UAAU,MAAM,OAAO;AAAA,UAC7C;AAAA,UACA;AAAA,QAAA,CACD;AACD;AAAA,MACF;AAEA,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,MAAM;AAChC,gBAAQ,MAAM;AAAA,MAChB,SAAS,YAAY;AACnB,eAAO,IAAI;AAAA,UACT,sCAAsC,sBAAsB,QAAQ,WAAW,UAAU,eAAe;AAAA,UACxG;AAAA,UACA,sBAAsB,QAAQ,aAAa;AAAA,QAAA,CAC5C;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Article } from '../providers/base/types.js';
|
|
2
|
+
import { RegistrationRecord } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Save registration record to session directory.
|
|
5
|
+
*/
|
|
6
|
+
export declare function saveRegistrationRecord(sessionDir: string, record: RegistrationRecord): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Load registration record from session directory.
|
|
9
|
+
* Returns null if file does not exist.
|
|
10
|
+
* Throws if file exists but is invalid.
|
|
11
|
+
*/
|
|
12
|
+
export declare function loadRegistrationRecord(sessionDir: string): Promise<RegistrationRecord | null>;
|
|
13
|
+
/**
|
|
14
|
+
* Options for registerArticles function.
|
|
15
|
+
*/
|
|
16
|
+
export interface RegisterOptions {
|
|
17
|
+
sessionId: string;
|
|
18
|
+
sessionDir: string;
|
|
19
|
+
withAbstracts?: boolean;
|
|
20
|
+
onProgress?: (current: number, total: number) => void;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Register articles with reference-manager.
|
|
24
|
+
* Processes each article and aggregates results.
|
|
25
|
+
*/
|
|
26
|
+
export declare function registerArticles(articles: Article[], options: RegisterOptions): Promise<RegistrationRecord>;
|
|
27
|
+
//# sourceMappingURL=register.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/integration/register.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAK/E;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAcpC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACvD;AAsCD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,kBAAkB,CAAC,CA4F7B"}
|