A packaging and distribution system for OpenICF-compatible connectors with semantic versioning support.
The external-connectors package provides tooling to bundle, version, and deploy connector implementations. Connectors are packaged as self-contained directories with a manifest that defines metadata, entry points, and instance configurations.
external-connectors/
├── dist/ # Built connector packages
│ └── <connector-name>/ # Individual connector distribution
│ ├── index.js # Bundled entry point
│ ├── config.js # Optional configuration module
│ └── manifest.json # Connector metadata
├── scripts/
│ └── add-connector.mjs # Packaging script
└── package.json
Use the add-connector script to package a connector for distribution:
npm run add-connector -- \
--src ./path/to/source \
--name connector-name \
--type connector-type \
--version 1.0.0 \
--entry index.ts \
--config config.ts \
--minify true--src: Source directory containing connector implementation--name: Distribution name (alphanumeric, underscores, hyphens only, max 128 chars)--type: Connector type identifier (alphanumeric, underscores, hyphens only, max 128 chars)--version: Semantic version (must follow semver specification)--entry: Entry point file path relative to source directory
--config: Configuration module path relative to source directory--instances: Path to instances configuration file--minify: Enable code minification (default: false)
Each packaged connector includes a manifest.json file:
{
"id": "unique-connector-id",
"type": "connector-type",
"version": "1.0.0",
"entry": "./index.js",
"config": "./config.js",
"instances": [
{
"id": "instance-id",
"config": {},
"connectorVersion": "1.0.0"
}
]
}id: Unique identifier for the connector distributiontype: Connector type (e.g., "msgraph", "salesforce")version: Semantic version of the connectorentry: Relative path to bundled entry moduleconfig: Optional relative path to configuration moduleinstances: Optional array of pre-configured instances
Instances can be defined in three ways (in priority order):
- Manifest instances: Defined directly in
manifest.json - Environment variables: Using
CONNECTOR_INSTANCESorCONNECTOR_INSTANCES_<ID> - Configuration file: Separate instances configuration file
{
"id": "string", // Unique instance identifier
"config": {}, // Instance-specific configuration
"connectorVersion": "1.0.0" // Optional version override
}Connectors use semantic versioning. The registry supports multiple versions of the same connector type simultaneously.
- Multiple versions can coexist:
msgraph@1.0.0,msgraph@2.0.0 - Instances can specify version overrides using
connectorVersion - Version sorting follows semver specification
The add-connector script performs the following steps:
- Validation: Validates name, type, version, and file paths
- Bundling: Uses esbuild to bundle entry and config modules
- Export Validation: Verifies entry point exports a factory function
- Manifest Generation: Creates manifest.json with metadata
- Output: Places bundled files in
dist/<connector-name>/
- Platform: Node.js (node18+)
- Format: ESM modules
- External dependencies:
@openicf/connector-spi - Sourcemaps: Generated
- Minification: Optional
Optional configuration modules support two patterns:
export default {
apiUrl: "https://api.example.com",
timeout: 30000
};export function buildConfiguration(raw) {
return {
apiUrl: raw.apiUrl || "https://api.example.com",
timeout: parseInt(raw.timeout) || 30000
};
}Configuration modules can export either a plain object or a buildConfiguration function that processes raw configuration at runtime.
Configuration values support environment variable substitution. Variables in the format ${VAR_NAME} are resolved at instance initialization.
npm run add-connector: Package a connector for distributionnpm run clean: Remove all built artifacts from dist/
- esbuild: ^0.25.10 - JavaScript bundler
- @openicf/connector-spi: file:../connector-spi - Connector interface definitions
- Node.js 18 or higher
- ESM module support