@package-broker/core 0.17.4 → 0.19.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cache/index.d.ts +0 -1
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +0 -1
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/memory-driver.d.ts +1 -1
- package/dist/cache/memory-driver.d.ts.map +1 -1
- package/dist/cache/memory-driver.js +4 -2
- package/dist/cache/memory-driver.js.map +1 -1
- package/dist/db/create-database.d.ts +8 -0
- package/dist/db/create-database.d.ts.map +1 -0
- package/dist/db/create-database.js +13 -0
- package/dist/db/create-database.js.map +1 -0
- package/dist/db/index.d.ts +0 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +0 -1
- package/dist/db/index.js.map +1 -1
- package/dist/db/schema.d.ts +557 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +72 -2
- package/dist/db/schema.js.map +1 -1
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +22 -2
- package/dist/factory.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/jobs/processor.d.ts.map +1 -1
- package/dist/jobs/processor.js +16 -6
- package/dist/jobs/processor.js.map +1 -1
- package/dist/kernel/container.d.ts +12 -0
- package/dist/kernel/container.d.ts.map +1 -0
- package/dist/kernel/container.js +43 -0
- package/dist/kernel/container.js.map +1 -0
- package/dist/kernel/events.d.ts +17 -0
- package/dist/kernel/events.d.ts.map +1 -0
- package/dist/kernel/events.js +54 -0
- package/dist/kernel/events.js.map +1 -0
- package/dist/kernel/hooks.d.ts +14 -0
- package/dist/kernel/hooks.d.ts.map +1 -0
- package/dist/kernel/hooks.js +31 -0
- package/dist/kernel/hooks.js.map +1 -0
- package/dist/kernel/index.d.ts +5 -0
- package/dist/kernel/index.d.ts.map +1 -0
- package/dist/kernel/index.js +5 -0
- package/dist/kernel/index.js.map +1 -0
- package/dist/kernel/plugin.d.ts +21 -0
- package/dist/kernel/plugin.d.ts.map +1 -0
- package/dist/kernel/plugin.js +30 -0
- package/dist/kernel/plugin.js.map +1 -0
- package/dist/middleware/auth.d.ts +2 -0
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +20 -5
- package/dist/middleware/auth.js.map +1 -1
- package/dist/modules/admin/admin.handlers.d.ts +1 -1
- package/dist/modules/admin/admin.handlers.d.ts.map +1 -1
- package/dist/modules/artifacts/artifacts.handlers.d.ts +1 -1
- package/dist/modules/artifacts/artifacts.handlers.d.ts.map +1 -1
- package/dist/modules/auth/auth.handlers.js +1 -1
- package/dist/modules/auth/auth.handlers.js.map +1 -1
- package/dist/modules/composer/index.d.ts.map +1 -1
- package/dist/modules/composer/index.js +5 -0
- package/dist/modules/composer/index.js.map +1 -1
- package/dist/modules/composer/tenant-composer.d.ts +32 -0
- package/dist/modules/composer/tenant-composer.d.ts.map +1 -0
- package/dist/modules/composer/tenant-composer.js +198 -0
- package/dist/modules/composer/tenant-composer.js.map +1 -0
- package/dist/modules/import/import.handlers.d.ts +4 -0
- package/dist/modules/import/import.handlers.d.ts.map +1 -0
- package/dist/modules/import/import.handlers.js +16 -0
- package/dist/modules/import/import.handlers.js.map +1 -0
- package/dist/{routes/api/openapi/settings.d.ts → modules/import/import.routes.d.ts} +20 -35
- package/dist/modules/import/import.routes.d.ts.map +1 -0
- package/dist/modules/import/import.routes.js +63 -0
- package/dist/modules/import/import.routes.js.map +1 -0
- package/dist/modules/import/index.d.ts +8 -0
- package/dist/modules/import/index.d.ts.map +1 -0
- package/dist/modules/import/index.js +8 -0
- package/dist/modules/import/index.js.map +1 -0
- package/dist/modules/organizations/index.d.ts +8 -0
- package/dist/modules/organizations/index.d.ts.map +1 -0
- package/dist/modules/organizations/index.js +22 -0
- package/dist/modules/organizations/index.js.map +1 -0
- package/dist/modules/organizations/organizations.handlers.d.ts +24 -0
- package/dist/modules/organizations/organizations.handlers.d.ts.map +1 -0
- package/dist/modules/organizations/organizations.handlers.js +278 -0
- package/dist/modules/organizations/organizations.handlers.js.map +1 -0
- package/dist/modules/organizations/organizations.routes.d.ts +596 -0
- package/dist/modules/organizations/organizations.routes.d.ts.map +1 -0
- package/dist/modules/organizations/organizations.routes.js +263 -0
- package/dist/modules/organizations/organizations.routes.js.map +1 -0
- package/dist/modules/packages/packages.handlers.d.ts +1 -1
- package/dist/modules/packages/packages.handlers.d.ts.map +1 -1
- package/dist/modules/packages/packages.handlers.js +3 -69
- package/dist/modules/packages/packages.handlers.js.map +1 -1
- package/dist/modules/repositories/repositories.handlers.d.ts +1 -1
- package/dist/modules/repositories/repositories.handlers.d.ts.map +1 -1
- package/dist/modules/repositories/repositories.handlers.js +74 -3
- package/dist/modules/repositories/repositories.handlers.js.map +1 -1
- package/dist/modules/repositories/repositories.routes.d.ts +12 -0
- package/dist/modules/repositories/repositories.routes.d.ts.map +1 -1
- package/dist/modules/system/index.d.ts.map +1 -1
- package/dist/modules/system/index.js +2 -1
- package/dist/modules/system/index.js.map +1 -1
- package/dist/modules/system/system.handlers.d.ts +11 -1
- package/dist/modules/system/system.handlers.d.ts.map +1 -1
- package/dist/modules/system/system.handlers.js +31 -1
- package/dist/modules/system/system.handlers.js.map +1 -1
- package/dist/modules/system/system.routes.d.ts +34 -4
- package/dist/modules/system/system.routes.d.ts.map +1 -1
- package/dist/modules/system/system.routes.js +21 -1
- package/dist/modules/system/system.routes.js.map +1 -1
- package/dist/modules/tenants/index.d.ts +8 -0
- package/dist/modules/tenants/index.d.ts.map +1 -0
- package/dist/modules/tenants/index.js +21 -0
- package/dist/modules/tenants/index.js.map +1 -0
- package/dist/modules/tenants/tenants.handlers.d.ts +24 -0
- package/dist/modules/tenants/tenants.handlers.d.ts.map +1 -0
- package/dist/modules/tenants/tenants.handlers.js +268 -0
- package/dist/modules/tenants/tenants.handlers.js.map +1 -0
- package/dist/modules/tenants/tenants.routes.d.ts +486 -0
- package/dist/modules/tenants/tenants.routes.d.ts.map +1 -0
- package/dist/modules/tenants/tenants.routes.js +227 -0
- package/dist/modules/tenants/tenants.routes.js.map +1 -0
- package/dist/modules/tokens/tokens.handlers.d.ts +1 -1
- package/dist/modules/tokens/tokens.handlers.d.ts.map +1 -1
- package/dist/modules/users/users.handlers.d.ts +1 -1
- package/dist/modules/users/users.handlers.d.ts.map +1 -1
- package/dist/modules/users/users.handlers.js +1 -1
- package/dist/modules/users/users.handlers.js.map +1 -1
- package/dist/plugins/security-advisories/advisory-db.d.ts +85 -0
- package/dist/plugins/security-advisories/advisory-db.d.ts.map +1 -0
- package/dist/plugins/security-advisories/advisory-db.js +161 -0
- package/dist/plugins/security-advisories/advisory-db.js.map +1 -0
- package/dist/plugins/security-advisories/advisory-service.d.ts +44 -0
- package/dist/plugins/security-advisories/advisory-service.d.ts.map +1 -0
- package/dist/plugins/security-advisories/advisory-service.js +122 -0
- package/dist/plugins/security-advisories/advisory-service.js.map +1 -0
- package/dist/plugins/security-advisories/advisory.handlers.d.ts +13 -0
- package/dist/plugins/security-advisories/advisory.handlers.d.ts.map +1 -0
- package/dist/plugins/security-advisories/advisory.handlers.js +87 -0
- package/dist/plugins/security-advisories/advisory.handlers.js.map +1 -0
- package/dist/plugins/security-advisories/advisory.module.d.ts +4 -0
- package/dist/plugins/security-advisories/advisory.module.d.ts.map +1 -0
- package/dist/plugins/security-advisories/advisory.module.js +13 -0
- package/dist/plugins/security-advisories/advisory.module.js.map +1 -0
- package/dist/plugins/security-advisories/advisory.routes.d.ts +73 -0
- package/dist/plugins/security-advisories/advisory.routes.d.ts.map +1 -0
- package/dist/plugins/security-advisories/advisory.routes.js +76 -0
- package/dist/plugins/security-advisories/advisory.routes.js.map +1 -0
- package/dist/plugins/security-advisories/index.d.ts +31 -0
- package/dist/plugins/security-advisories/index.d.ts.map +1 -0
- package/dist/plugins/security-advisories/index.js +100 -0
- package/dist/plugins/security-advisories/index.js.map +1 -0
- package/dist/ports.d.ts +39 -21
- package/dist/ports.d.ts.map +1 -1
- package/dist/queue/consumer.d.ts +0 -8
- package/dist/queue/consumer.d.ts.map +1 -1
- package/dist/queue/consumer.js +2 -23
- package/dist/queue/consumer.js.map +1 -1
- package/dist/queue/index.d.ts +2 -0
- package/dist/queue/index.d.ts.map +1 -1
- package/dist/queue/index.js +2 -0
- package/dist/queue/index.js.map +1 -1
- package/dist/queue/memory-driver.d.ts +3 -2
- package/dist/queue/memory-driver.d.ts.map +1 -1
- package/dist/queue/memory-driver.js.map +1 -1
- package/dist/routes/composer.d.ts +7 -1
- package/dist/routes/composer.d.ts.map +1 -1
- package/dist/routes/composer.js +172 -70
- package/dist/routes/composer.js.map +1 -1
- package/dist/routes/dist.d.ts.map +1 -1
- package/dist/routes/dist.js +26 -80
- package/dist/routes/dist.js.map +1 -1
- package/dist/routes/index.d.ts +0 -1
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +0 -1
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/package-revalidation.d.ts +38 -0
- package/dist/routes/package-revalidation.d.ts.map +1 -0
- package/dist/routes/package-revalidation.js +66 -0
- package/dist/routes/package-revalidation.js.map +1 -0
- package/dist/services/GitHubOrgImporter.d.ts +21 -0
- package/dist/services/GitHubOrgImporter.d.ts.map +1 -0
- package/dist/services/GitHubOrgImporter.js +51 -0
- package/dist/services/GitHubOrgImporter.js.map +1 -0
- package/dist/services/TokenScopeService.d.ts +15 -0
- package/dist/services/TokenScopeService.d.ts.map +1 -0
- package/dist/services/TokenScopeService.js +42 -0
- package/dist/services/TokenScopeService.js.map +1 -0
- package/dist/storage/index.d.ts +0 -1
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +0 -1
- package/dist/storage/index.js.map +1 -1
- package/dist/sync/repository-sync.d.ts.map +1 -1
- package/dist/sync/repository-sync.js +35 -23
- package/dist/sync/repository-sync.js.map +1 -1
- package/dist/sync/strategies/git-ssh.d.ts +17 -0
- package/dist/sync/strategies/git-ssh.d.ts.map +1 -0
- package/dist/sync/strategies/git-ssh.js +325 -0
- package/dist/sync/strategies/git-ssh.js.map +1 -0
- package/dist/{routes/api/types.d.ts → types/openapi.d.ts} +3 -4
- package/dist/types/openapi.d.ts.map +1 -0
- package/dist/{routes/api/types.js → types/openapi.js} +1 -1
- package/dist/types/openapi.js.map +1 -0
- package/dist/utils/background.d.ts +7 -0
- package/dist/utils/background.d.ts.map +1 -0
- package/dist/utils/background.js +11 -0
- package/dist/utils/background.js.map +1 -0
- package/dist/utils/environment.d.ts +15 -0
- package/dist/utils/environment.d.ts.map +1 -0
- package/dist/utils/environment.js +38 -0
- package/dist/utils/environment.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/package-filter.d.ts +7 -0
- package/dist/utils/package-filter.d.ts.map +1 -0
- package/dist/utils/package-filter.js +23 -0
- package/dist/utils/package-filter.js.map +1 -0
- package/dist/utils/package-validator.d.ts +3 -3
- package/dist/utils/package-validator.d.ts.map +1 -1
- package/dist/utils/package-validator.js +4 -37
- package/dist/utils/package-validator.js.map +1 -1
- package/dist/utils/upstream-fetch.d.ts +18 -0
- package/dist/utils/upstream-fetch.d.ts.map +1 -1
- package/dist/utils/upstream-fetch.js +76 -5
- package/dist/utils/upstream-fetch.js.map +1 -1
- package/dist/utils/zip-utils.d.ts +13 -0
- package/dist/utils/zip-utils.d.ts.map +1 -0
- package/dist/utils/zip-utils.js +66 -0
- package/dist/utils/zip-utils.js.map +1 -0
- package/dist/vcs/bitbucket-provider.d.ts +19 -0
- package/dist/vcs/bitbucket-provider.d.ts.map +1 -0
- package/dist/vcs/bitbucket-provider.js +249 -0
- package/dist/vcs/bitbucket-provider.js.map +1 -0
- package/dist/vcs/github-provider.d.ts +16 -0
- package/dist/vcs/github-provider.d.ts.map +1 -0
- package/dist/vcs/github-provider.js +117 -0
- package/dist/vcs/github-provider.js.map +1 -0
- package/dist/vcs/gitlab-provider.d.ts +17 -0
- package/dist/vcs/gitlab-provider.d.ts.map +1 -0
- package/dist/vcs/gitlab-provider.js +216 -0
- package/dist/vcs/gitlab-provider.js.map +1 -0
- package/dist/vcs/index.d.ts +10 -0
- package/dist/vcs/index.d.ts.map +1 -0
- package/dist/vcs/index.js +24 -0
- package/dist/vcs/index.js.map +1 -0
- package/dist/vcs/registry.d.ts +32 -0
- package/dist/vcs/registry.d.ts.map +1 -0
- package/dist/vcs/registry.js +47 -0
- package/dist/vcs/registry.js.map +1 -0
- package/dist/workflows/package-storage.d.ts.map +1 -1
- package/dist/workflows/package-storage.js +3 -3
- package/dist/workflows/package-storage.js.map +1 -1
- package/package.json +11 -8
- package/dist/cache/kv-driver.d.ts +0 -16
- package/dist/cache/kv-driver.d.ts.map +0 -1
- package/dist/cache/kv-driver.js +0 -23
- package/dist/cache/kv-driver.js.map +0 -1
- package/dist/db/d1-driver.d.ts +0 -3
- package/dist/db/d1-driver.d.ts.map +0 -1
- package/dist/db/d1-driver.js +0 -7
- package/dist/db/d1-driver.js.map +0 -1
- package/dist/routes/api/artifacts.d.ts +0 -27
- package/dist/routes/api/artifacts.d.ts.map +0 -1
- package/dist/routes/api/artifacts.js +0 -57
- package/dist/routes/api/artifacts.js.map +0 -1
- package/dist/routes/api/auth.d.ts +0 -52
- package/dist/routes/api/auth.d.ts.map +0 -1
- package/dist/routes/api/auth.js +0 -277
- package/dist/routes/api/auth.js.map +0 -1
- package/dist/routes/api/index.d.ts +0 -10
- package/dist/routes/api/index.d.ts.map +0 -1
- package/dist/routes/api/index.js +0 -11
- package/dist/routes/api/index.js.map +0 -1
- package/dist/routes/api/openapi/artifacts.d.ts +0 -80
- package/dist/routes/api/openapi/artifacts.d.ts.map +0 -1
- package/dist/routes/api/openapi/artifacts.js +0 -73
- package/dist/routes/api/openapi/artifacts.js.map +0 -1
- package/dist/routes/api/openapi/auth.d.ts +0 -187
- package/dist/routes/api/openapi/auth.d.ts.map +0 -1
- package/dist/routes/api/openapi/auth.js +0 -135
- package/dist/routes/api/openapi/auth.js.map +0 -1
- package/dist/routes/api/openapi/health.d.ts +0 -23
- package/dist/routes/api/openapi/health.d.ts.map +0 -1
- package/dist/routes/api/openapi/health.js +0 -25
- package/dist/routes/api/openapi/health.js.map +0 -1
- package/dist/routes/api/openapi/index.d.ts +0 -10
- package/dist/routes/api/openapi/index.d.ts.map +0 -1
- package/dist/routes/api/openapi/index.js +0 -16
- package/dist/routes/api/openapi/index.js.map +0 -1
- package/dist/routes/api/openapi/packages.d.ts +0 -172
- package/dist/routes/api/openapi/packages.d.ts.map +0 -1
- package/dist/routes/api/openapi/packages.js +0 -126
- package/dist/routes/api/openapi/packages.js.map +0 -1
- package/dist/routes/api/openapi/repositories.d.ts +0 -451
- package/dist/routes/api/openapi/repositories.d.ts.map +0 -1
- package/dist/routes/api/openapi/repositories.js +0 -238
- package/dist/routes/api/openapi/repositories.js.map +0 -1
- package/dist/routes/api/openapi/settings.d.ts.map +0 -1
- package/dist/routes/api/openapi/settings.js +0 -72
- package/dist/routes/api/openapi/settings.js.map +0 -1
- package/dist/routes/api/openapi/stats.d.ts +0 -59
- package/dist/routes/api/openapi/stats.d.ts.map +0 -1
- package/dist/routes/api/openapi/stats.js +0 -53
- package/dist/routes/api/openapi/stats.js.map +0 -1
- package/dist/routes/api/openapi/tokens.d.ts +0 -202
- package/dist/routes/api/openapi/tokens.d.ts.map +0 -1
- package/dist/routes/api/openapi/tokens.js +0 -132
- package/dist/routes/api/openapi/tokens.js.map +0 -1
- package/dist/routes/api/openapi/users.d.ts +0 -190
- package/dist/routes/api/openapi/users.d.ts.map +0 -1
- package/dist/routes/api/openapi/users.js +0 -126
- package/dist/routes/api/openapi/users.js.map +0 -1
- package/dist/routes/api/packages.d.ts +0 -50
- package/dist/routes/api/packages.d.ts.map +0 -1
- package/dist/routes/api/packages.js +0 -708
- package/dist/routes/api/packages.js.map +0 -1
- package/dist/routes/api/repositories.d.ts +0 -58
- package/dist/routes/api/repositories.d.ts.map +0 -1
- package/dist/routes/api/repositories.js +0 -321
- package/dist/routes/api/repositories.js.map +0 -1
- package/dist/routes/api/settings.d.ts +0 -29
- package/dist/routes/api/settings.d.ts.map +0 -1
- package/dist/routes/api/settings.js +0 -81
- package/dist/routes/api/settings.js.map +0 -1
- package/dist/routes/api/stats.d.ts +0 -21
- package/dist/routes/api/stats.d.ts.map +0 -1
- package/dist/routes/api/stats.js +0 -51
- package/dist/routes/api/stats.js.map +0 -1
- package/dist/routes/api/tokens.d.ts +0 -40
- package/dist/routes/api/tokens.d.ts.map +0 -1
- package/dist/routes/api/tokens.js +0 -187
- package/dist/routes/api/tokens.js.map +0 -1
- package/dist/routes/api/types.d.ts.map +0 -1
- package/dist/routes/api/types.js.map +0 -1
- package/dist/routes/api/users.d.ts +0 -6
- package/dist/routes/api/users.d.ts.map +0 -1
- package/dist/routes/api/users.js +0 -115
- package/dist/routes/api/users.js.map +0 -1
- package/dist/storage/r2-driver.d.ts +0 -16
- package/dist/storage/r2-driver.d.ts.map +0 -1
- package/dist/storage/r2-driver.js +0 -28
- package/dist/storage/r2-driver.js.map +0 -1
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* PACKAGE.broker
|
|
3
|
+
* Copyright (C) 2025 Łukasz Bajsarowicz
|
|
4
|
+
* Licensed under AGPL-3.0
|
|
5
|
+
*/
|
|
6
|
+
import { getLogger } from '../../utils/logger';
|
|
7
|
+
import micromatch from 'micromatch';
|
|
8
|
+
import semver from 'semver';
|
|
9
|
+
const logger = getLogger();
|
|
10
|
+
/**
|
|
11
|
+
* Clone git repository using SSH key
|
|
12
|
+
* @param url - Git repository URL (SSH format: git@github.com:owner/repo.git or HTTPS)
|
|
13
|
+
* @param privateKey - SSH private key
|
|
14
|
+
* @param passphrase - Optional passphrase for encrypted private key
|
|
15
|
+
* @param composerJsonPath - Glob pattern for composer.json files
|
|
16
|
+
* @returns Sync result with packages
|
|
17
|
+
*/
|
|
18
|
+
export async function syncViaGitSsh(url, privateKey, passphrase, composerJsonPath = '**/composer.json') {
|
|
19
|
+
// Dynamically import Node.js modules (only available in Node.js environment)
|
|
20
|
+
const { writeFile, mkdir, rm, chmod } = await import('fs/promises');
|
|
21
|
+
const { join } = await import('path');
|
|
22
|
+
const { tmpdir } = await import('os');
|
|
23
|
+
const tempDir = join(tmpdir(), `package-broker-${Date.now()}-${Math.random().toString(36).slice(0, 7)}`);
|
|
24
|
+
const keyPath = join(tempDir, 'ssh_key');
|
|
25
|
+
let repoPath = null;
|
|
26
|
+
try {
|
|
27
|
+
// Create temporary directory
|
|
28
|
+
await mkdir(tempDir, { recursive: true });
|
|
29
|
+
// Write private key to temporary file
|
|
30
|
+
await writeFile(keyPath, privateKey, { mode: 0o600 });
|
|
31
|
+
await chmod(keyPath, 0o600);
|
|
32
|
+
// Validate sshpass availability when passphrase is provided
|
|
33
|
+
if (passphrase) {
|
|
34
|
+
const { execSync } = await import('child_process');
|
|
35
|
+
try {
|
|
36
|
+
execSync('which sshpass', { stdio: 'ignore' });
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
throw new Error('sshpass is required for passphrase-protected SSH keys but is not installed');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Convert HTTPS URL to SSH format if needed
|
|
43
|
+
const sshUrl = convertToSshUrl(url);
|
|
44
|
+
repoPath = join(tempDir, 'repo');
|
|
45
|
+
// Clone repository using SSH
|
|
46
|
+
await cloneRepository(sshUrl, repoPath, keyPath, passphrase);
|
|
47
|
+
// Find and parse composer.json files
|
|
48
|
+
const packages = await findAndParseComposerFiles(repoPath, composerJsonPath);
|
|
49
|
+
if (packages.length === 0) {
|
|
50
|
+
return {
|
|
51
|
+
success: false,
|
|
52
|
+
packages: [],
|
|
53
|
+
error: 'no_composer_json_found',
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
logger.info('SSH git sync completed', {
|
|
57
|
+
url,
|
|
58
|
+
packageCount: packages.length,
|
|
59
|
+
});
|
|
60
|
+
return {
|
|
61
|
+
success: true,
|
|
62
|
+
packages,
|
|
63
|
+
strategy: 'git_ssh',
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
logger.error('SSH git sync failed', { url, error: error instanceof Error ? error.message : String(error) });
|
|
68
|
+
return {
|
|
69
|
+
success: false,
|
|
70
|
+
packages: [],
|
|
71
|
+
error: error instanceof Error ? error.message : 'ssh_sync_failed',
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
// Clean up temporary files
|
|
76
|
+
try {
|
|
77
|
+
if (repoPath) {
|
|
78
|
+
await rm(repoPath, { recursive: true, force: true });
|
|
79
|
+
}
|
|
80
|
+
if (keyPath) {
|
|
81
|
+
await rm(keyPath, { force: true });
|
|
82
|
+
}
|
|
83
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
84
|
+
}
|
|
85
|
+
catch (cleanupError) {
|
|
86
|
+
logger.warn('Failed to clean up temporary files', { tempDir, error: cleanupError instanceof Error ? cleanupError.message : String(cleanupError) });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Convert HTTPS URL to SSH format
|
|
92
|
+
* Example: https://github.com/owner/repo.git -> git@github.com:owner/repo.git
|
|
93
|
+
*/
|
|
94
|
+
function convertToSshUrl(url) {
|
|
95
|
+
// If already SSH format, return as-is
|
|
96
|
+
if (url.startsWith('git@') || url.startsWith('ssh://')) {
|
|
97
|
+
return url;
|
|
98
|
+
}
|
|
99
|
+
// Convert HTTPS to SSH
|
|
100
|
+
const match = url.match(/https?:\/\/([^/]+)\/([^/]+)\/([^/]+?)(?:\.git)?\/?$/);
|
|
101
|
+
if (match) {
|
|
102
|
+
const [, host, owner, repo] = match;
|
|
103
|
+
return `git@${host}:${owner}/${repo}.git`;
|
|
104
|
+
}
|
|
105
|
+
// If conversion fails, return original URL (git clone will handle it)
|
|
106
|
+
return url;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Clone git repository using SSH key
|
|
110
|
+
*/
|
|
111
|
+
/**
|
|
112
|
+
* Escape a string for use in shell command (basic escaping)
|
|
113
|
+
* Only escapes single quotes and wraps in single quotes
|
|
114
|
+
*/
|
|
115
|
+
function escapeShellArg(arg) {
|
|
116
|
+
// Replace single quotes with '\'' (end quote, escaped quote, start quote)
|
|
117
|
+
return `'${arg.replace(/'/g, "'\\''")}'`;
|
|
118
|
+
}
|
|
119
|
+
async function cloneRepository(url, targetPath, keyPath, passphrase) {
|
|
120
|
+
const { spawn } = await import('child_process');
|
|
121
|
+
// Set up SSH command with key - properly escape keyPath
|
|
122
|
+
const escapedKeyPath = escapeShellArg(keyPath);
|
|
123
|
+
const sshCommand = `ssh -i ${escapedKeyPath} -o StrictHostKeyChecking=accept-new -o IdentitiesOnly=yes`;
|
|
124
|
+
const gitEnv = {
|
|
125
|
+
...process.env,
|
|
126
|
+
GIT_SSH_COMMAND: passphrase
|
|
127
|
+
? `sshpass -p ${escapeShellArg(passphrase)} ${sshCommand}`
|
|
128
|
+
: sshCommand,
|
|
129
|
+
};
|
|
130
|
+
// Clone repository
|
|
131
|
+
await new Promise((resolve, reject) => {
|
|
132
|
+
const gitProcess = spawn('git', ['clone', '--depth', '1', url, targetPath], {
|
|
133
|
+
env: gitEnv,
|
|
134
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
135
|
+
});
|
|
136
|
+
let stdout = '';
|
|
137
|
+
let stderr = '';
|
|
138
|
+
gitProcess.stdout?.on('data', (data) => {
|
|
139
|
+
stdout += data.toString();
|
|
140
|
+
});
|
|
141
|
+
gitProcess.stderr?.on('data', (data) => {
|
|
142
|
+
stderr += data.toString();
|
|
143
|
+
});
|
|
144
|
+
gitProcess.on('close', (code) => {
|
|
145
|
+
if (code === 0) {
|
|
146
|
+
resolve();
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
reject(new Error(`Git clone failed: ${stderr || stdout || 'Unknown error'}`));
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
gitProcess.on('error', (error) => {
|
|
153
|
+
reject(new Error(`Failed to spawn git process: ${error.message}`));
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
// Fetch tags separately (shallow clone doesn't include them)
|
|
157
|
+
await new Promise((resolve) => {
|
|
158
|
+
const fetchTags = spawn('git', ['fetch', '--tags', '--depth', '1'], {
|
|
159
|
+
cwd: targetPath,
|
|
160
|
+
env: gitEnv,
|
|
161
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
162
|
+
});
|
|
163
|
+
fetchTags.on('close', (code) => {
|
|
164
|
+
if (code !== 0) {
|
|
165
|
+
logger.warn('Failed to fetch tags, versions may be limited', { url, code });
|
|
166
|
+
}
|
|
167
|
+
resolve();
|
|
168
|
+
});
|
|
169
|
+
fetchTags.on('error', () => resolve());
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Recursively find files matching a name pattern
|
|
174
|
+
* Uses Node.js APIs instead of shell commands for security
|
|
175
|
+
*/
|
|
176
|
+
async function findFilesRecursive(dirPath, fileName) {
|
|
177
|
+
const { readdir, stat } = await import('fs/promises');
|
|
178
|
+
const { join } = await import('path');
|
|
179
|
+
const files = [];
|
|
180
|
+
async function walkDir(currentPath) {
|
|
181
|
+
try {
|
|
182
|
+
const entries = await readdir(currentPath);
|
|
183
|
+
for (const entry of entries) {
|
|
184
|
+
const fullPath = join(currentPath, entry);
|
|
185
|
+
try {
|
|
186
|
+
const stats = await stat(fullPath);
|
|
187
|
+
if (stats.isDirectory()) {
|
|
188
|
+
await walkDir(fullPath);
|
|
189
|
+
}
|
|
190
|
+
else if (stats.isFile() && entry === fileName) {
|
|
191
|
+
files.push(fullPath);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// Skip files/dirs we can't access
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
// Skip directories we can't read
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
await walkDir(dirPath);
|
|
206
|
+
return files;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Find and parse composer.json files from cloned repository
|
|
210
|
+
*/
|
|
211
|
+
async function findAndParseComposerFiles(repoPath, pattern) {
|
|
212
|
+
try {
|
|
213
|
+
// Find all composer.json files using Node.js APIs (no shell commands)
|
|
214
|
+
const allFiles = await findFilesRecursive(repoPath, 'composer.json');
|
|
215
|
+
// Filter files by glob pattern
|
|
216
|
+
// Make paths relative to repoPath for pattern matching
|
|
217
|
+
const relativeFiles = allFiles.map((file) => {
|
|
218
|
+
const relative = file.replace(repoPath, '').replace(/^\//, '');
|
|
219
|
+
return relative;
|
|
220
|
+
});
|
|
221
|
+
const matchedFiles = micromatch(relativeFiles, pattern);
|
|
222
|
+
// Convert back to full paths
|
|
223
|
+
const { join } = await import('path');
|
|
224
|
+
const fullMatchedFiles = matchedFiles.map((file) => join(repoPath, file));
|
|
225
|
+
if (matchedFiles.length === 0) {
|
|
226
|
+
return [];
|
|
227
|
+
}
|
|
228
|
+
// Parse each composer.json file
|
|
229
|
+
const packages = [];
|
|
230
|
+
const { readFile } = await import('fs/promises');
|
|
231
|
+
for (const fullPath of fullMatchedFiles) {
|
|
232
|
+
try {
|
|
233
|
+
const content = await readFile(fullPath, 'utf-8');
|
|
234
|
+
const composerJson = JSON.parse(content);
|
|
235
|
+
if (composerJson.name) {
|
|
236
|
+
// Get version from git tags
|
|
237
|
+
const versions = await getVersionsFromTags(repoPath);
|
|
238
|
+
for (const version of versions) {
|
|
239
|
+
packages.push({
|
|
240
|
+
name: composerJson.name,
|
|
241
|
+
version,
|
|
242
|
+
description: composerJson.description,
|
|
243
|
+
license: composerJson.license,
|
|
244
|
+
type: composerJson.type,
|
|
245
|
+
homepage: composerJson.homepage,
|
|
246
|
+
require: composerJson.require,
|
|
247
|
+
'require-dev': composerJson['require-dev'],
|
|
248
|
+
autoload: composerJson.autoload,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
// If no versions found, add at least one entry
|
|
252
|
+
if (versions.length === 0) {
|
|
253
|
+
packages.push({
|
|
254
|
+
name: composerJson.name,
|
|
255
|
+
version: 'dev-main',
|
|
256
|
+
description: composerJson.description,
|
|
257
|
+
license: composerJson.license,
|
|
258
|
+
type: composerJson.type,
|
|
259
|
+
homepage: composerJson.homepage,
|
|
260
|
+
require: composerJson.require,
|
|
261
|
+
'require-dev': composerJson['require-dev'],
|
|
262
|
+
autoload: composerJson.autoload,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
logger.warn('Failed to parse composer.json', { file: fullPath, error: error instanceof Error ? error.message : String(error) });
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return packages;
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
logger.error('Failed to find composer.json files', { repoPath, pattern, error: error instanceof Error ? error.message : String(error) });
|
|
275
|
+
return [];
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Get versions from git tags
|
|
280
|
+
*/
|
|
281
|
+
async function getVersionsFromTags(repoPath) {
|
|
282
|
+
const { spawn } = await import('child_process');
|
|
283
|
+
try {
|
|
284
|
+
// Use spawn with cwd option instead of shell cd command for security
|
|
285
|
+
return new Promise((resolve) => {
|
|
286
|
+
const gitProcess = spawn('git', ['tag', '-l'], {
|
|
287
|
+
cwd: repoPath, // Use cwd option instead of shell cd
|
|
288
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
289
|
+
});
|
|
290
|
+
let stdout = '';
|
|
291
|
+
let stderr = '';
|
|
292
|
+
gitProcess.stdout?.on('data', (data) => {
|
|
293
|
+
stdout += data.toString();
|
|
294
|
+
});
|
|
295
|
+
gitProcess.stderr?.on('data', (data) => {
|
|
296
|
+
stderr += data.toString();
|
|
297
|
+
});
|
|
298
|
+
gitProcess.on('close', (code) => {
|
|
299
|
+
if (code === 0) {
|
|
300
|
+
const tags = stdout.trim().split('\n').filter(Boolean);
|
|
301
|
+
// Filter and sort valid semver tags
|
|
302
|
+
const versions = tags
|
|
303
|
+
.map((tag) => tag.replace(/^v/, '')) // Remove 'v' prefix
|
|
304
|
+
.filter((tag) => semver.valid(tag))
|
|
305
|
+
.sort((a, b) => semver.rcompare(a, b))
|
|
306
|
+
.slice(0, 50); // Limit to 50 versions
|
|
307
|
+
resolve(versions);
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
logger.warn('Failed to get git tags', { repoPath, stderr });
|
|
311
|
+
resolve([]);
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
gitProcess.on('error', (error) => {
|
|
315
|
+
logger.warn('Failed to spawn git tag process', { repoPath, error: error instanceof Error ? error.message : String(error) });
|
|
316
|
+
resolve([]);
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
catch (error) {
|
|
321
|
+
logger.warn('Failed to get git tags', { repoPath, error: error instanceof Error ? error.message : String(error) });
|
|
322
|
+
return [];
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=git-ssh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-ssh.js","sourceRoot":"","sources":["../../../src/sync/strategies/git-ssh.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import type { Context } from 'hono';
|
|
2
2
|
/**
|
|
3
|
-
* Helper type for OpenAPI route handlers
|
|
4
|
-
* When a route is registered with app.openapi(), c.req.valid() becomes available
|
|
5
|
-
* This type assertion allows TypeScript to recognize it
|
|
3
|
+
* Helper type for OpenAPI route handlers.
|
|
4
|
+
* When a route is registered with app.openapi(), c.req.valid() becomes available.
|
|
6
5
|
*/
|
|
7
6
|
export type OpenAPIContext<TEnv extends Record<string, any> = any, TJson = any, TParam = Record<string, string>, TQuery = Record<string, string>> = Context<TEnv> & {
|
|
8
7
|
req: Context<TEnv>['req'] & {
|
|
@@ -14,4 +13,4 @@ export type OpenAPIContext<TEnv extends Record<string, any> = any, TJson = any,
|
|
|
14
13
|
};
|
|
15
14
|
};
|
|
16
15
|
};
|
|
17
|
-
//# sourceMappingURL=
|
|
16
|
+
//# sourceMappingURL=openapi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/types/openapi.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC;;;GAGG;AACH,MAAM,MAAM,cAAc,CACxB,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EACtC,KAAK,GAAG,GAAG,EACX,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAC7B,OAAO,CAAC,IAAI,CAAC,GAAG;IAClB,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG;QAC1B,KAAK,EAAE;YACL,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;YACrB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC;YACvB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC;YACvB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;SACpB,CAAC;KACH,CAAC;CACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/types/openapi.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background.d.ts","sourceRoot":"","sources":["../../src/utils/background.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE;QACZ,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;KAC5C,CAAC;CACH;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAQrF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background.js","sourceRoot":"","sources":["../../src/utils/background.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,eAAe,CAAC,CAAoB,EAAE,OAAyB;IAC7E,IAAI,CAAC;QACH,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE;YACjB,iEAAiE;QACnE,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment detection utilities
|
|
3
|
+
* Used to determine if we're running in Cloudflare Workers or Node.js
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Check if we're running in Cloudflare Workers environment
|
|
7
|
+
* Cloudflare Workers don't have Node.js process object
|
|
8
|
+
*/
|
|
9
|
+
export declare function isCloudflareWorkers(): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Check if SSH key support is available
|
|
12
|
+
* SSH requires child_process which is only available in Node.js
|
|
13
|
+
*/
|
|
14
|
+
export declare function isSshSupported(): boolean;
|
|
15
|
+
//# sourceMappingURL=environment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/utils/environment.ts"],"names":[],"mappings":"AAMA;;;GAGG;AAEH;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAG7C;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAexC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* PACKAGE.broker
|
|
3
|
+
* Copyright (C) 2025 Łukasz Bajsarowicz
|
|
4
|
+
* Licensed under AGPL-3.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Environment detection utilities
|
|
8
|
+
* Used to determine if we're running in Cloudflare Workers or Node.js
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Check if we're running in Cloudflare Workers environment
|
|
12
|
+
* Cloudflare Workers don't have Node.js process object
|
|
13
|
+
*/
|
|
14
|
+
export function isCloudflareWorkers() {
|
|
15
|
+
// In Cloudflare Workers, process is undefined or doesn't have versions.node
|
|
16
|
+
return typeof process === 'undefined' || !process.versions?.node;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check if SSH key support is available
|
|
20
|
+
* SSH requires child_process which is only available in Node.js
|
|
21
|
+
*/
|
|
22
|
+
export function isSshSupported() {
|
|
23
|
+
if (isCloudflareWorkers()) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
// In Node.js, process.versions.node exists and child_process is available
|
|
27
|
+
// We can't actually import child_process here (would break Workers bundle),
|
|
28
|
+
// so we check for Node.js environment indicators
|
|
29
|
+
try {
|
|
30
|
+
return typeof process !== 'undefined' &&
|
|
31
|
+
typeof process.versions !== 'undefined' &&
|
|
32
|
+
typeof process.versions.node !== 'undefined';
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/utils/environment.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AAEH;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,4EAA4E;IAC5E,OAAO,OAAO,OAAO,KAAK,WAAW,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,mBAAmB,EAAE,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,0EAA0E;IAC1E,6EAA6E;IAC7E,iDAAiD;IACjD,IAAI,CAAC;QACH,OAAO,OAAO,OAAO,KAAK,WAAW;YAC9B,OAAO,OAAO,CAAC,QAAQ,KAAK,WAAW;YACvC,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
|
package/dist/utils/index.js
CHANGED
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if a package name matches a filter pattern.
|
|
3
|
+
* Supports glob-style patterns: 'vendor/*' matches 'vendor/anything'.
|
|
4
|
+
* Comma-separated patterns: 'vendor/*,other/pkg' matches either.
|
|
5
|
+
*/
|
|
6
|
+
export declare function matchesPackageFilter(packageName: string, filter: string): boolean;
|
|
7
|
+
//# sourceMappingURL=package-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-filter.d.ts","sourceRoot":"","sources":["../../src/utils/package-filter.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAYjF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* PACKAGE.broker
|
|
3
|
+
* Copyright (C) 2025 Łukasz Bajsarowicz
|
|
4
|
+
* Licensed under AGPL-3.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Check if a package name matches a filter pattern.
|
|
8
|
+
* Supports glob-style patterns: 'vendor/*' matches 'vendor/anything'.
|
|
9
|
+
* Comma-separated patterns: 'vendor/*,other/pkg' matches either.
|
|
10
|
+
*/
|
|
11
|
+
export function matchesPackageFilter(packageName, filter) {
|
|
12
|
+
const patterns = filter.split(',').map((p) => p.trim().toLowerCase());
|
|
13
|
+
const pkgLower = packageName.toLowerCase();
|
|
14
|
+
return patterns.some((pattern) => {
|
|
15
|
+
// Only support vendor/* style globs (must have / before *)
|
|
16
|
+
if (pattern.endsWith('/*')) {
|
|
17
|
+
const prefix = pattern.slice(0, -1); // 'vendor/' from 'vendor/*'
|
|
18
|
+
return pkgLower.startsWith(prefix);
|
|
19
|
+
}
|
|
20
|
+
return pkgLower === pattern;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=package-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-filter.js","sourceRoot":"","sources":["../../src/utils/package-filter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAmB,EAAE,MAAc;IACtE,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;IAE3C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QAC/B,2DAA2D;QAC3D,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,4BAA4B;YACjE,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,QAAQ,KAAK,OAAO,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -70,8 +70,8 @@ export interface ValidationResult {
|
|
|
70
70
|
*/
|
|
71
71
|
export declare function validatePackageArchive(archiveData: Uint8Array): Promise<ValidationResult>;
|
|
72
72
|
/**
|
|
73
|
-
* Extract README.md from package archive
|
|
74
|
-
*
|
|
73
|
+
* Extract README.md from package archive.
|
|
74
|
+
* Delegates to shared zip-utils implementation.
|
|
75
75
|
*/
|
|
76
|
-
export declare
|
|
76
|
+
export declare const extractReadme: (data: Uint8Array) => string | null;
|
|
77
77
|
//# sourceMappingURL=package-validator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-validator.d.ts","sourceRoot":"","sources":["../../src/utils/package-validator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"package-validator.d.ts","sourceRoot":"","sources":["../../src/utils/package-validator.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,KAAK,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IACH,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;QAC5C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF,cAAc,CAAC,EAAE;QACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;QAC5C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,UAAU,GACtB,OAAO,CAAC,gBAAgB,CAAC,CAiL3B;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,qCAAuB,CAAC"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Licensed under AGPL-3.0
|
|
5
5
|
*/
|
|
6
6
|
import { unzipSync, strFromU8 } from 'fflate';
|
|
7
|
+
import { extractReadme as extractReadmeFromZip } from './zip-utils';
|
|
7
8
|
/**
|
|
8
9
|
* Validate a package archive and extract composer.json metadata
|
|
9
10
|
*
|
|
@@ -176,42 +177,8 @@ export async function validatePackageArchive(archiveData) {
|
|
|
176
177
|
};
|
|
177
178
|
}
|
|
178
179
|
/**
|
|
179
|
-
* Extract README.md from package archive
|
|
180
|
-
*
|
|
180
|
+
* Extract README.md from package archive.
|
|
181
|
+
* Delegates to shared zip-utils implementation.
|
|
181
182
|
*/
|
|
182
|
-
export
|
|
183
|
-
try {
|
|
184
|
-
const files = unzipSync(zipData);
|
|
185
|
-
const readmeNames = [
|
|
186
|
-
'README.md', 'readme.md', 'README.MD', 'Readme.md',
|
|
187
|
-
'README.mdown', 'readme.mdown', 'README.MDOWN', 'Readme.mdown',
|
|
188
|
-
'README', 'readme', 'README.txt', 'readme.txt',
|
|
189
|
-
];
|
|
190
|
-
let filesChecked = 0;
|
|
191
|
-
const MAX_FILES_TO_CHECK = 50;
|
|
192
|
-
// Look for README in root or first-level directory
|
|
193
|
-
for (const [path, content] of Object.entries(files)) {
|
|
194
|
-
filesChecked++;
|
|
195
|
-
if (filesChecked > MAX_FILES_TO_CHECK) {
|
|
196
|
-
break;
|
|
197
|
-
}
|
|
198
|
-
const filename = path.split('/').pop() || '';
|
|
199
|
-
const filenameLower = filename.toLowerCase();
|
|
200
|
-
// Prefer .md files
|
|
201
|
-
if (readmeNames.slice(0, 8).some(name => filenameLower === name.toLowerCase())) {
|
|
202
|
-
// Limit README size to 500KB
|
|
203
|
-
if (content.length > 500 * 1024) {
|
|
204
|
-
console.warn(`README too large: ${path} (${content.length} bytes)`);
|
|
205
|
-
continue;
|
|
206
|
-
}
|
|
207
|
-
return strFromU8(content);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
return null;
|
|
211
|
-
}
|
|
212
|
-
catch (error) {
|
|
213
|
-
console.error('Error extracting README from ZIP:', error);
|
|
214
|
-
return null;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
183
|
+
export const extractReadme = extractReadmeFromZip;
|
|
217
184
|
//# sourceMappingURL=package-validator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-validator.js","sourceRoot":"","sources":["../../src/utils/package-validator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AA+
|
|
1
|
+
{"version":3,"file":"package-validator.js","sourceRoot":"","sources":["../../src/utils/package-validator.ts"],"names":[],"mappings":"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"}
|