@package-broker/core 0.17.4 → 0.19.5
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.js +1 -1
- 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.js +2 -2
- package/dist/queue/consumer.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.map +1 -1
- package/dist/routes/composer.js +71 -19
- 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/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 +8 -0
- package/dist/utils/upstream-fetch.d.ts.map +1 -1
- package/dist/utils/upstream-fetch.js +42 -0
- 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
|
@@ -3,22 +3,22 @@
|
|
|
3
3
|
* Copyright (C) 2025 Łukasz Bajsarowicz
|
|
4
4
|
* Licensed under AGPL-3.0
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import { createD1Database } from '../db';
|
|
6
|
+
import { createDatabase } from '../db/create-database';
|
|
8
7
|
import { repositories, packages as packagesTable } from '../db/schema';
|
|
9
8
|
import { eq, and } from 'drizzle-orm';
|
|
10
9
|
import { decryptCredentials } from '../utils/encryption';
|
|
11
|
-
import { syncGitHubRepository } from './github-sync';
|
|
12
10
|
import { syncComposerRepository } from './strategies/composer-repo';
|
|
13
11
|
import { nanoid } from 'nanoid';
|
|
14
12
|
import { getLogger } from '../utils/logger';
|
|
15
13
|
import { getAnalytics } from '../utils/analytics';
|
|
14
|
+
import { isSshSupported } from '../utils/environment';
|
|
15
|
+
import { getVcsProviderRegistry } from '../vcs/registry';
|
|
16
16
|
/**
|
|
17
17
|
* Sync a repository by ID
|
|
18
18
|
* Called on-demand when packages.json is requested
|
|
19
19
|
*/
|
|
20
20
|
export async function syncRepository(repoId, env, options) {
|
|
21
|
-
const db =
|
|
21
|
+
const db = createDatabase(env.DB);
|
|
22
22
|
// Get repository details
|
|
23
23
|
const [repo] = await db
|
|
24
24
|
.select()
|
|
@@ -128,25 +128,37 @@ export async function syncRepository(repoId, env, options) {
|
|
|
128
128
|
* Supports:
|
|
129
129
|
* - Authenticated GitHub repos (github_token)
|
|
130
130
|
* - Public GitHub repos (none credential type)
|
|
131
|
+
* - SSH key authentication (ssh_key) - Node.js only
|
|
131
132
|
*/
|
|
132
133
|
async function syncGitRepository(url, credentialType, credentials, composerJsonPath) {
|
|
133
|
-
//
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
134
|
+
// Handle SSH key authentication (Node.js only)
|
|
135
|
+
if (credentialType === 'ssh_key') {
|
|
136
|
+
if (!isSshSupported()) {
|
|
137
|
+
return {
|
|
138
|
+
success: false,
|
|
139
|
+
packages: [],
|
|
140
|
+
error: 'ssh_not_supported',
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
const privateKey = credentials.private_key;
|
|
144
|
+
if (!privateKey) {
|
|
145
|
+
return {
|
|
146
|
+
success: false,
|
|
147
|
+
packages: [],
|
|
148
|
+
error: 'ssh_key_required',
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
// Dynamically import SSH sync strategy (Node.js only)
|
|
152
|
+
const { syncViaGitSsh } = await import('./strategies/git-ssh');
|
|
153
|
+
return syncViaGitSsh(url, privateKey, credentials.passphrase, composerJsonPath || '**/composer.json');
|
|
154
|
+
}
|
|
155
|
+
// Resolve VCS provider from registry (supports GitHub, GitLab, Bitbucket)
|
|
156
|
+
const registry = getVcsProviderRegistry();
|
|
157
|
+
const provider = registry.resolve(url);
|
|
158
|
+
if (provider) {
|
|
159
|
+
return provider.syncRepository(url, credentials, credentialType, composerJsonPath);
|
|
147
160
|
}
|
|
148
|
-
//
|
|
149
|
-
// For now, return error for unsupported Git hosts
|
|
161
|
+
// No registered provider matched the URL
|
|
150
162
|
return {
|
|
151
163
|
success: false,
|
|
152
164
|
packages: [],
|
|
@@ -178,13 +190,13 @@ async function storePackages(db, repoId, packages, options) {
|
|
|
178
190
|
const [existing] = await db
|
|
179
191
|
.select()
|
|
180
192
|
.from(packagesTable)
|
|
181
|
-
.where(and(eq(packagesTable.name, pkg.name), eq(packagesTable.version, pkg.version)))
|
|
193
|
+
.where(and(eq(packagesTable.repo_id, repoId), eq(packagesTable.name, pkg.name), eq(packagesTable.version, pkg.version)))
|
|
182
194
|
.limit(1);
|
|
183
195
|
const now = Math.floor(Date.now() / 1000);
|
|
184
196
|
const firstSeenAt = existing?.created_at || now;
|
|
185
197
|
// Use upstream time if available, otherwise use first-seen date (created_at)
|
|
186
198
|
const releasedAt = parseReleaseTime(pkg.time, firstSeenAt);
|
|
187
|
-
// Upsert package (use unique constraint on name+version)
|
|
199
|
+
// Upsert package (use unique constraint on repo_id+name+version)
|
|
188
200
|
try {
|
|
189
201
|
await db.insert(packagesTable).values({
|
|
190
202
|
id: nanoid(),
|
|
@@ -203,7 +215,7 @@ async function storePackages(db, repoId, packages, options) {
|
|
|
203
215
|
metadata: pkg.rawMetadata ? JSON.stringify(pkg.rawMetadata) : null,
|
|
204
216
|
created_at: firstSeenAt,
|
|
205
217
|
}).onConflictDoUpdate({
|
|
206
|
-
target: [packagesTable.name, packagesTable.version],
|
|
218
|
+
target: [packagesTable.repo_id, packagesTable.name, packagesTable.version],
|
|
207
219
|
set: {
|
|
208
220
|
dist_url: proxyDistUrl,
|
|
209
221
|
source_dist_url: sourceDistUrl,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository-sync.js","sourceRoot":"","sources":["../../src/sync/repository-sync.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"repository-sync.js","sourceRoot":"","sources":["../../src/sync/repository-sync.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAIpE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAczD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAc,EACd,GAAY,EACZ,OAAoB;IAEpB,MAAM,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAElC,yBAAyB;IACzB,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE;SACpB,MAAM,EAAE;SACR,IAAI,CAAC,YAAY,CAAC;SAClB,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;SAClC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEZ,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IACnE,CAAC;IAED,2BAA2B;IAC3B,MAAM,EAAE;SACL,MAAM,CAAC,YAAY,CAAC;SACpB,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;SAC1B,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAEtC,mBAAmB;IACnB,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,SAAS,CAAC,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,sBAAsB;QACtB,MAAM,eAAe,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5F,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAEhD,IAAI,UAAsB,CAAC;QAE3B,8EAA8E;QAC9E,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YAC5B,UAAU,GAAG,MAAM,iBAAiB,CAClC,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,eAAiC,EACtC,WAAW,EACX,IAAI,CAAC,kBAAkB,IAAI,SAAS,CACrC,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;YACxC,UAAU,GAAG,MAAM,sBAAsB,CACvC,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,eAAiC,EACtC,WAAW,EACX,IAAI,CAAC,cAAc,IAAI,SAAS,CACjC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;QAC/E,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxB,yBAAyB;YACzB,MAAM,EAAE;iBACL,MAAM,CAAC,YAAY,CAAC;iBACpB,GAAG,CAAC;gBACH,MAAM,EAAE,OAAO;gBACf,aAAa,EAAE,UAAU,CAAC,KAAK;gBAC/B,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;aAC9C,CAAC;iBACD,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;YAEtC,qBAAqB;YACrB,SAAS,CAAC,0BAA0B,CAAC;gBACnC,MAAM;gBACN,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,eAAe;aAC3C,CAAC,CAAC;YAEH,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,yCAAyC;QACzC,MAAM,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE9D,2BAA2B;QAC3B,MAAM,EAAE;aACL,MAAM,CAAC,YAAY,CAAC;aACpB,GAAG,CAAC;YACH,MAAM,EAAE,QAAQ;YAChB,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;SAC9C,CAAC;aACD,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAEtC,wCAAwC;QACxC,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,MAAM,gBAAgB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YACzE,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YACnE,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QAChE,CAAC;QAED,qBAAqB;QACrB,SAAS,CAAC,0BAA0B,CAAC;YACnC,MAAM;YACN,YAAY,EAAE,UAAU,CAAC,QAAQ,CAAC,MAAM;YACxC,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,SAAS;SAC3C,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,QAAQ,EAAE,UAAU,CAAC,QAAQ;SAC9B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAE3G,yBAAyB;QACzB,MAAM,EAAE;aACL,MAAM,CAAC,YAAY,CAAC;aACpB,GAAG,CAAC;YACH,MAAM,EAAE,OAAO;YACf,aAAa,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;YACvE,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;SAC9C,CAAC;aACD,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAEtC,qBAAqB;QACrB,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,SAAS,CAAC,0BAA0B,CAAC;YACnC,MAAM;YACN,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,iBAAiB,CAC9B,GAAW,EACX,cAA8B,EAC9B,WAAmC,EACnC,gBAAyB;IAEzB,+CAA+C;IAC/C,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,mBAAmB;aAC3B,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CAAC;QAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,kBAAkB;aAC1B,CAAC;QACJ,CAAC;QAED,sDAAsD;QACtD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC/D,OAAO,aAAa,CAClB,GAAG,EACH,UAAU,EACV,WAAW,CAAC,UAAU,EACtB,gBAAgB,IAAI,kBAAkB,CACvC,CAAC;IACJ,CAAC;IAED,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,sBAAsB,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEvC,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC,cAAc,CAAC,GAAG,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;IACrF,CAAC;IAED,yCAAyC;IACzC,OAAO;QACL,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,sBAAsB;KAC9B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,OAAgB,EAAE,QAAiB;IAC3D,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAC1B,EAAY,EACZ,MAAc,EACd,QAA2B,EAC3B,OAAoB;IAEpB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,kCAAkC;QAClC,MAAM,YAAY,GAAG,GAAG,OAAO,CAAC,YAAY,SAAS,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,MAAM,CAAC;QAC7F,yDAAyD;QACzD,MAAM,aAAa,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC;QAE5C,kEAAkE;QAClE,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE;aACxB,MAAM,EAAE;aACR,IAAI,CAAC,aAAa,CAAC;aACnB,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,EACjC,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,EAChC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CACvC,CACF;aACA,KAAK,CAAC,CAAC,CAAC,CAAC;QAEZ,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,MAAM,WAAW,GAAG,QAAQ,EAAE,UAAU,IAAI,GAAG,CAAC;QAEhD,6EAA6E;QAC7E,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAE3D,iEAAiE;QACjE,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC;gBACpC,EAAE,EAAE,MAAM,EAAE;gBACZ,OAAO,EAAE,MAAM;gBACf,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,QAAQ,EAAE,YAAY;gBACtB,eAAe,EAAE,aAAa;gBAC9B,cAAc,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,IAAI,IAAI;gBAC3C,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;gBACpC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;gBACzD,YAAY,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI;gBAC9B,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI;gBAC9B,WAAW,EAAE,UAAU;gBACvB,cAAc,EAAE,GAAG,CAAC,MAAM,IAAI,IAAI;gBAClC,QAAQ,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;gBAClE,UAAU,EAAE,WAAW;aACxB,CAAC,CAAC,kBAAkB,CAAC;gBACpB,MAAM,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC;gBAC1E,GAAG,EAAE;oBACH,QAAQ,EAAE,YAAY;oBACtB,eAAe,EAAE,aAAa;oBAC9B,cAAc,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,IAAI,IAAI;oBAC3C,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;oBACpC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;oBACzD,YAAY,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI;oBAC9B,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI;oBAC9B,WAAW,EAAE,UAAU;oBACvB,QAAQ,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;iBACnE;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5J,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git SSH sync strategy
|
|
3
|
+
* Clones git repositories using SSH keys (Node.js only, not available in Cloudflare Workers)
|
|
4
|
+
*
|
|
5
|
+
* This module uses dynamic imports for Node.js-specific modules to avoid bundling issues
|
|
6
|
+
*/
|
|
7
|
+
import type { SyncResult } from '../types';
|
|
8
|
+
/**
|
|
9
|
+
* Clone git repository using SSH key
|
|
10
|
+
* @param url - Git repository URL (SSH format: git@github.com:owner/repo.git or HTTPS)
|
|
11
|
+
* @param privateKey - SSH private key
|
|
12
|
+
* @param passphrase - Optional passphrase for encrypted private key
|
|
13
|
+
* @param composerJsonPath - Glob pattern for composer.json files
|
|
14
|
+
* @returns Sync result with packages
|
|
15
|
+
*/
|
|
16
|
+
export declare function syncViaGitSsh(url: string, privateKey: string, passphrase?: string, composerJsonPath?: string): Promise<SyncResult>;
|
|
17
|
+
//# sourceMappingURL=git-ssh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-ssh.d.ts","sourceRoot":"","sources":["../../../src/sync/strategies/git-ssh.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,UAAU,CAAC;AAO5D;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,EACnB,gBAAgB,GAAE,MAA2B,GAC5C,OAAO,CAAC,UAAU,CAAC,CA8ErB"}
|
|
@@ -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"}
|