@objectstack/service-package 4.0.4 → 4.0.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/index.cjs +9 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.cjs
CHANGED
|
@@ -25,6 +25,11 @@ __export(index_exports, {
|
|
|
25
25
|
});
|
|
26
26
|
module.exports = __toCommonJS(index_exports);
|
|
27
27
|
var import_node_crypto = require("crypto");
|
|
28
|
+
function normalizeRows(result) {
|
|
29
|
+
if (Array.isArray(result)) return result;
|
|
30
|
+
if (result && Array.isArray(result.rows)) return result.rows;
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
28
33
|
var PackageServicePlugin = class {
|
|
29
34
|
constructor() {
|
|
30
35
|
this.name = "package-service";
|
|
@@ -81,10 +86,11 @@ var PackageServicePlugin = class {
|
|
|
81
86
|
const sql = version === "latest" ? `SELECT * FROM sys_packages WHERE id = ? ORDER BY created_at DESC LIMIT 1` : `SELECT * FROM sys_packages WHERE id = ? AND version = ?`;
|
|
82
87
|
const args = version === "latest" ? [packageId] : [packageId, version];
|
|
83
88
|
const result = await objectql.execute({ sql, args });
|
|
84
|
-
|
|
89
|
+
const rows = normalizeRows(result);
|
|
90
|
+
if (rows.length === 0) {
|
|
85
91
|
return null;
|
|
86
92
|
}
|
|
87
|
-
const row =
|
|
93
|
+
const row = rows[0];
|
|
88
94
|
return {
|
|
89
95
|
id: row.id,
|
|
90
96
|
version: row.version,
|
|
@@ -110,7 +116,7 @@ var PackageServicePlugin = class {
|
|
|
110
116
|
ORDER BY created_at DESC
|
|
111
117
|
`
|
|
112
118
|
});
|
|
113
|
-
return result.
|
|
119
|
+
return normalizeRows(result).map((row) => ({
|
|
114
120
|
id: row.id,
|
|
115
121
|
version: row.version,
|
|
116
122
|
manifest: JSON.parse(row.manifest),
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport type { Plugin, PluginContext } from '@objectstack/core';\nimport { createHash } from 'node:crypto';\nimport type { ObjectStackManifest } from '@objectstack/spec/kernel';\nimport type { IDataEngine } from '@objectstack/spec/contracts';\n\nexport interface PackageMetadata {\n objects?: any[];\n views?: any[];\n apps?: any[];\n flows?: any[];\n agents?: any[];\n tools?: any[];\n translations?: any[];\n}\n\nexport interface PackageRecord {\n id: string;\n version: string;\n manifest: ObjectStackManifest;\n metadata: PackageMetadata;\n hash: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface PackageService {\n publish(data: { manifest: ObjectStackManifest; metadata: PackageMetadata }): Promise<{ success: boolean; error?: string }>;\n get(packageId: string, version?: string): Promise<PackageRecord | null>;\n list(): Promise<PackageRecord[]>;\n delete(packageId: string, version?: string): Promise<{ success: boolean }>;\n}\n\n/**\n * Package Management Service Plugin\n *\n * Provides package publishing, retrieval, and management capabilities.\n * Stores package metadata in the sys.packages table for dynamic loading.\n */\nexport class PackageServicePlugin implements Plugin {\n name = 'package-service';\n\n async init(ctx: PluginContext): Promise<void> {\n // Service will be registered in start() after ObjectQL is available\n ctx.logger.debug('Package service plugin initialized');\n }\n\n async start(ctx: PluginContext): Promise<void> {\n const logger = ctx.logger;\n\n // Get ObjectQL service (available in start() hook after dependencies are initialized)\n const objectql = ctx.getService<IDataEngine>('objectql');\n if (!objectql || !objectql.execute) {\n throw new Error('ObjectQL service with execute() support is required for PackageService');\n }\n\n // Create sys_packages table if it doesn't exist\n try {\n await this.ensureTable(objectql, logger);\n } catch (error) {\n logger.error('Failed to create sys_packages table', error as Error);\n throw error;\n }\n\n // Create the package service\n const packageService: PackageService = {\n async publish(data: { manifest: ObjectStackManifest; metadata: PackageMetadata }) {\n try {\n const hash = createHash('sha256')\n .update(JSON.stringify({ manifest: data.manifest, metadata: data.metadata }))\n .digest('hex');\n\n await objectql.execute!({\n sql: `\n INSERT INTO sys_packages (id, version, manifest, metadata, hash, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)\n ON CONFLICT(id, version) DO UPDATE SET\n manifest = excluded.manifest,\n metadata = excluded.metadata,\n hash = excluded.hash,\n updated_at = CURRENT_TIMESTAMP\n `,\n args: [\n data.manifest.id,\n data.manifest.version,\n JSON.stringify(data.manifest),\n JSON.stringify(data.metadata),\n hash,\n ],\n });\n\n logger.info(`Published package: ${data.manifest.id}@${data.manifest.version}`);\n return { success: true };\n } catch (error) {\n logger.error('Failed to publish package', error as Error);\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n },\n\n async get(packageId: string, version: string = 'latest') {\n try {\n const sql = version === 'latest'\n ? `SELECT * FROM sys_packages WHERE id = ? ORDER BY created_at DESC LIMIT 1`\n : `SELECT * FROM sys_packages WHERE id = ? AND version = ?`;\n\n const args = version === 'latest' ? [packageId] : [packageId, version];\n const result = await objectql.execute!({ sql, args });\n\n if (result.rows.length === 0) {\n return null;\n }\n\n const row = result.rows[0];\n return {\n id: row.id,\n version: row.version,\n manifest: JSON.parse(row.manifest),\n metadata: JSON.parse(row.metadata),\n hash: row.hash,\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n } catch (error) {\n logger.error(`Failed to get package: ${packageId}`, error as Error);\n return null;\n }\n },\n\n async list() {\n try {\n const result = await objectql.execute!({\n sql: `\n SELECT * FROM sys_packages\n WHERE (id, created_at) IN (\n SELECT id, MAX(created_at) FROM sys_packages GROUP BY id\n )\n ORDER BY created_at DESC\n `,\n });\n\n return result.rows.map((row: any) => ({\n id: row.id,\n version: row.version,\n manifest: JSON.parse(row.manifest),\n metadata: JSON.parse(row.metadata),\n hash: row.hash,\n created_at: row.created_at,\n updated_at: row.updated_at,\n }));\n } catch (error) {\n logger.error('Failed to list packages', error as Error);\n return [];\n }\n },\n\n async delete(packageId: string, version?: string) {\n try {\n const sql = version\n ? `DELETE FROM sys_packages WHERE id = ? AND version = ?`\n : `DELETE FROM sys_packages WHERE id = ?`;\n\n const args = version ? [packageId, version] : [packageId];\n await objectql.execute!({ sql, args });\n\n logger.info(`Deleted package: ${packageId}${version ? `@${version}` : ''}`);\n return { success: true };\n } catch (error) {\n logger.error('Failed to delete package', error as Error);\n return { success: false };\n }\n },\n };\n\n ctx.registerService('package', packageService);\n logger.info('Package service initialized');\n }\n\n private async ensureTable(objectql: IDataEngine, logger: any): Promise<void> {\n try {\n // Create the sys_packages table\n await objectql.execute!({\n sql: `\n CREATE TABLE IF NOT EXISTS sys_packages (\n id TEXT NOT NULL,\n version TEXT NOT NULL,\n manifest TEXT NOT NULL,\n metadata TEXT NOT NULL,\n hash TEXT NOT NULL,\n created_at TEXT DEFAULT CURRENT_TIMESTAMP,\n updated_at TEXT DEFAULT CURRENT_TIMESTAMP,\n PRIMARY KEY (id, version)\n )\n `,\n });\n\n // Create index for faster latest version queries\n await objectql.execute!({\n sql: `\n CREATE INDEX IF NOT EXISTS idx_packages_latest\n ON sys_packages(id, created_at DESC)\n `,\n });\n\n logger.debug('sys_packages table ensured');\n } catch (error) {\n // Table might already exist, log and continue\n logger.debug('sys_packages table creation skipped (may already exist)');\n }\n }\n}\n\nexport { PackageServicePlugin as default };\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport type { Plugin, PluginContext } from '@objectstack/core';\nimport { createHash } from 'node:crypto';\nimport type { ObjectStackManifest } from '@objectstack/spec/kernel';\nimport type { IDataEngine } from '@objectstack/spec/contracts';\n\nexport interface PackageMetadata {\n objects?: any[];\n views?: any[];\n apps?: any[];\n flows?: any[];\n agents?: any[];\n tools?: any[];\n translations?: any[];\n}\n\nexport interface PackageRecord {\n id: string;\n version: string;\n manifest: ObjectStackManifest;\n metadata: PackageMetadata;\n hash: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface PackageService {\n publish(data: { manifest: ObjectStackManifest; metadata: PackageMetadata }): Promise<{ success: boolean; error?: string }>;\n get(packageId: string, version?: string): Promise<PackageRecord | null>;\n list(): Promise<PackageRecord[]>;\n delete(packageId: string, version?: string): Promise<{ success: boolean }>;\n}\n\n/**\n * Normalize the result of `objectql.execute()` into a row array.\n *\n * Different drivers return different shapes for raw SELECT statements:\n * - SQL driver (knex/SQLite) and Turso remote transport return rows\n * directly as an array.\n * - PostgreSQL (knex/pg) returns `{ rows, rowCount, ... }`.\n * - Some drivers may return `{ rows: [...] }` wrappers in other contexts.\n *\n * This helper accepts any of those shapes and always returns an array.\n */\nfunction normalizeRows(result: any): any[] {\n if (Array.isArray(result)) return result;\n if (result && Array.isArray(result.rows)) return result.rows;\n return [];\n}\n\n/**\n * Package Management Service Plugin\n *\n * Provides package publishing, retrieval, and management capabilities.\n * Stores package metadata in the sys.packages table for dynamic loading.\n */\nexport class PackageServicePlugin implements Plugin {\n name = 'package-service';\n\n async init(ctx: PluginContext): Promise<void> {\n // Service will be registered in start() after ObjectQL is available\n ctx.logger.debug('Package service plugin initialized');\n }\n\n async start(ctx: PluginContext): Promise<void> {\n const logger = ctx.logger;\n\n // Get ObjectQL service (available in start() hook after dependencies are initialized)\n const objectql = ctx.getService<IDataEngine>('objectql');\n if (!objectql || !objectql.execute) {\n throw new Error('ObjectQL service with execute() support is required for PackageService');\n }\n\n // Create sys_packages table if it doesn't exist\n try {\n await this.ensureTable(objectql, logger);\n } catch (error) {\n logger.error('Failed to create sys_packages table', error as Error);\n throw error;\n }\n\n // Create the package service\n const packageService: PackageService = {\n async publish(data: { manifest: ObjectStackManifest; metadata: PackageMetadata }) {\n try {\n const hash = createHash('sha256')\n .update(JSON.stringify({ manifest: data.manifest, metadata: data.metadata }))\n .digest('hex');\n\n await objectql.execute!({\n sql: `\n INSERT INTO sys_packages (id, version, manifest, metadata, hash, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)\n ON CONFLICT(id, version) DO UPDATE SET\n manifest = excluded.manifest,\n metadata = excluded.metadata,\n hash = excluded.hash,\n updated_at = CURRENT_TIMESTAMP\n `,\n args: [\n data.manifest.id,\n data.manifest.version,\n JSON.stringify(data.manifest),\n JSON.stringify(data.metadata),\n hash,\n ],\n });\n\n logger.info(`Published package: ${data.manifest.id}@${data.manifest.version}`);\n return { success: true };\n } catch (error) {\n logger.error('Failed to publish package', error as Error);\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n },\n\n async get(packageId: string, version: string = 'latest') {\n try {\n const sql = version === 'latest'\n ? `SELECT * FROM sys_packages WHERE id = ? ORDER BY created_at DESC LIMIT 1`\n : `SELECT * FROM sys_packages WHERE id = ? AND version = ?`;\n\n const args = version === 'latest' ? [packageId] : [packageId, version];\n const result = await objectql.execute!({ sql, args });\n const rows = normalizeRows(result);\n\n if (rows.length === 0) {\n return null;\n }\n\n const row = rows[0];\n return {\n id: row.id,\n version: row.version,\n manifest: JSON.parse(row.manifest),\n metadata: JSON.parse(row.metadata),\n hash: row.hash,\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n } catch (error) {\n logger.error(`Failed to get package: ${packageId}`, error as Error);\n return null;\n }\n },\n\n async list() {\n try {\n const result = await objectql.execute!({\n sql: `\n SELECT * FROM sys_packages\n WHERE (id, created_at) IN (\n SELECT id, MAX(created_at) FROM sys_packages GROUP BY id\n )\n ORDER BY created_at DESC\n `,\n });\n\n return normalizeRows(result).map((row: any) => ({\n id: row.id,\n version: row.version,\n manifest: JSON.parse(row.manifest),\n metadata: JSON.parse(row.metadata),\n hash: row.hash,\n created_at: row.created_at,\n updated_at: row.updated_at,\n }));\n } catch (error) {\n logger.error('Failed to list packages', error as Error);\n return [];\n }\n },\n\n async delete(packageId: string, version?: string) {\n try {\n const sql = version\n ? `DELETE FROM sys_packages WHERE id = ? AND version = ?`\n : `DELETE FROM sys_packages WHERE id = ?`;\n\n const args = version ? [packageId, version] : [packageId];\n await objectql.execute!({ sql, args });\n\n logger.info(`Deleted package: ${packageId}${version ? `@${version}` : ''}`);\n return { success: true };\n } catch (error) {\n logger.error('Failed to delete package', error as Error);\n return { success: false };\n }\n },\n };\n\n ctx.registerService('package', packageService);\n logger.info('Package service initialized');\n }\n\n private async ensureTable(objectql: IDataEngine, logger: any): Promise<void> {\n try {\n // Create the sys_packages table\n await objectql.execute!({\n sql: `\n CREATE TABLE IF NOT EXISTS sys_packages (\n id TEXT NOT NULL,\n version TEXT NOT NULL,\n manifest TEXT NOT NULL,\n metadata TEXT NOT NULL,\n hash TEXT NOT NULL,\n created_at TEXT DEFAULT CURRENT_TIMESTAMP,\n updated_at TEXT DEFAULT CURRENT_TIMESTAMP,\n PRIMARY KEY (id, version)\n )\n `,\n });\n\n // Create index for faster latest version queries\n await objectql.execute!({\n sql: `\n CREATE INDEX IF NOT EXISTS idx_packages_latest\n ON sys_packages(id, created_at DESC)\n `,\n });\n\n logger.debug('sys_packages table ensured');\n } catch (error) {\n // Table might already exist, log and continue\n logger.debug('sys_packages table creation skipped (may already exist)');\n }\n }\n}\n\nexport { PackageServicePlugin as default };\n"],"mappings":"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","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
import { createHash } from "crypto";
|
|
3
|
+
function normalizeRows(result) {
|
|
4
|
+
if (Array.isArray(result)) return result;
|
|
5
|
+
if (result && Array.isArray(result.rows)) return result.rows;
|
|
6
|
+
return [];
|
|
7
|
+
}
|
|
3
8
|
var PackageServicePlugin = class {
|
|
4
9
|
constructor() {
|
|
5
10
|
this.name = "package-service";
|
|
@@ -56,10 +61,11 @@ var PackageServicePlugin = class {
|
|
|
56
61
|
const sql = version === "latest" ? `SELECT * FROM sys_packages WHERE id = ? ORDER BY created_at DESC LIMIT 1` : `SELECT * FROM sys_packages WHERE id = ? AND version = ?`;
|
|
57
62
|
const args = version === "latest" ? [packageId] : [packageId, version];
|
|
58
63
|
const result = await objectql.execute({ sql, args });
|
|
59
|
-
|
|
64
|
+
const rows = normalizeRows(result);
|
|
65
|
+
if (rows.length === 0) {
|
|
60
66
|
return null;
|
|
61
67
|
}
|
|
62
|
-
const row =
|
|
68
|
+
const row = rows[0];
|
|
63
69
|
return {
|
|
64
70
|
id: row.id,
|
|
65
71
|
version: row.version,
|
|
@@ -85,7 +91,7 @@ var PackageServicePlugin = class {
|
|
|
85
91
|
ORDER BY created_at DESC
|
|
86
92
|
`
|
|
87
93
|
});
|
|
88
|
-
return result.
|
|
94
|
+
return normalizeRows(result).map((row) => ({
|
|
89
95
|
id: row.id,
|
|
90
96
|
version: row.version,
|
|
91
97
|
manifest: JSON.parse(row.manifest),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport type { Plugin, PluginContext } from '@objectstack/core';\nimport { createHash } from 'node:crypto';\nimport type { ObjectStackManifest } from '@objectstack/spec/kernel';\nimport type { IDataEngine } from '@objectstack/spec/contracts';\n\nexport interface PackageMetadata {\n objects?: any[];\n views?: any[];\n apps?: any[];\n flows?: any[];\n agents?: any[];\n tools?: any[];\n translations?: any[];\n}\n\nexport interface PackageRecord {\n id: string;\n version: string;\n manifest: ObjectStackManifest;\n metadata: PackageMetadata;\n hash: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface PackageService {\n publish(data: { manifest: ObjectStackManifest; metadata: PackageMetadata }): Promise<{ success: boolean; error?: string }>;\n get(packageId: string, version?: string): Promise<PackageRecord | null>;\n list(): Promise<PackageRecord[]>;\n delete(packageId: string, version?: string): Promise<{ success: boolean }>;\n}\n\n/**\n * Package Management Service Plugin\n *\n * Provides package publishing, retrieval, and management capabilities.\n * Stores package metadata in the sys.packages table for dynamic loading.\n */\nexport class PackageServicePlugin implements Plugin {\n name = 'package-service';\n\n async init(ctx: PluginContext): Promise<void> {\n // Service will be registered in start() after ObjectQL is available\n ctx.logger.debug('Package service plugin initialized');\n }\n\n async start(ctx: PluginContext): Promise<void> {\n const logger = ctx.logger;\n\n // Get ObjectQL service (available in start() hook after dependencies are initialized)\n const objectql = ctx.getService<IDataEngine>('objectql');\n if (!objectql || !objectql.execute) {\n throw new Error('ObjectQL service with execute() support is required for PackageService');\n }\n\n // Create sys_packages table if it doesn't exist\n try {\n await this.ensureTable(objectql, logger);\n } catch (error) {\n logger.error('Failed to create sys_packages table', error as Error);\n throw error;\n }\n\n // Create the package service\n const packageService: PackageService = {\n async publish(data: { manifest: ObjectStackManifest; metadata: PackageMetadata }) {\n try {\n const hash = createHash('sha256')\n .update(JSON.stringify({ manifest: data.manifest, metadata: data.metadata }))\n .digest('hex');\n\n await objectql.execute!({\n sql: `\n INSERT INTO sys_packages (id, version, manifest, metadata, hash, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)\n ON CONFLICT(id, version) DO UPDATE SET\n manifest = excluded.manifest,\n metadata = excluded.metadata,\n hash = excluded.hash,\n updated_at = CURRENT_TIMESTAMP\n `,\n args: [\n data.manifest.id,\n data.manifest.version,\n JSON.stringify(data.manifest),\n JSON.stringify(data.metadata),\n hash,\n ],\n });\n\n logger.info(`Published package: ${data.manifest.id}@${data.manifest.version}`);\n return { success: true };\n } catch (error) {\n logger.error('Failed to publish package', error as Error);\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n },\n\n async get(packageId: string, version: string = 'latest') {\n try {\n const sql = version === 'latest'\n ? `SELECT * FROM sys_packages WHERE id = ? ORDER BY created_at DESC LIMIT 1`\n : `SELECT * FROM sys_packages WHERE id = ? AND version = ?`;\n\n const args = version === 'latest' ? [packageId] : [packageId, version];\n const result = await objectql.execute!({ sql, args });\n\n if (result.rows.length === 0) {\n return null;\n }\n\n const row = result.rows[0];\n return {\n id: row.id,\n version: row.version,\n manifest: JSON.parse(row.manifest),\n metadata: JSON.parse(row.metadata),\n hash: row.hash,\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n } catch (error) {\n logger.error(`Failed to get package: ${packageId}`, error as Error);\n return null;\n }\n },\n\n async list() {\n try {\n const result = await objectql.execute!({\n sql: `\n SELECT * FROM sys_packages\n WHERE (id, created_at) IN (\n SELECT id, MAX(created_at) FROM sys_packages GROUP BY id\n )\n ORDER BY created_at DESC\n `,\n });\n\n return result.rows.map((row: any) => ({\n id: row.id,\n version: row.version,\n manifest: JSON.parse(row.manifest),\n metadata: JSON.parse(row.metadata),\n hash: row.hash,\n created_at: row.created_at,\n updated_at: row.updated_at,\n }));\n } catch (error) {\n logger.error('Failed to list packages', error as Error);\n return [];\n }\n },\n\n async delete(packageId: string, version?: string) {\n try {\n const sql = version\n ? `DELETE FROM sys_packages WHERE id = ? AND version = ?`\n : `DELETE FROM sys_packages WHERE id = ?`;\n\n const args = version ? [packageId, version] : [packageId];\n await objectql.execute!({ sql, args });\n\n logger.info(`Deleted package: ${packageId}${version ? `@${version}` : ''}`);\n return { success: true };\n } catch (error) {\n logger.error('Failed to delete package', error as Error);\n return { success: false };\n }\n },\n };\n\n ctx.registerService('package', packageService);\n logger.info('Package service initialized');\n }\n\n private async ensureTable(objectql: IDataEngine, logger: any): Promise<void> {\n try {\n // Create the sys_packages table\n await objectql.execute!({\n sql: `\n CREATE TABLE IF NOT EXISTS sys_packages (\n id TEXT NOT NULL,\n version TEXT NOT NULL,\n manifest TEXT NOT NULL,\n metadata TEXT NOT NULL,\n hash TEXT NOT NULL,\n created_at TEXT DEFAULT CURRENT_TIMESTAMP,\n updated_at TEXT DEFAULT CURRENT_TIMESTAMP,\n PRIMARY KEY (id, version)\n )\n `,\n });\n\n // Create index for faster latest version queries\n await objectql.execute!({\n sql: `\n CREATE INDEX IF NOT EXISTS idx_packages_latest\n ON sys_packages(id, created_at DESC)\n `,\n });\n\n logger.debug('sys_packages table ensured');\n } catch (error) {\n // Table might already exist, log and continue\n logger.debug('sys_packages table creation skipped (may already exist)');\n }\n }\n}\n\nexport { PackageServicePlugin as default };\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport type { Plugin, PluginContext } from '@objectstack/core';\nimport { createHash } from 'node:crypto';\nimport type { ObjectStackManifest } from '@objectstack/spec/kernel';\nimport type { IDataEngine } from '@objectstack/spec/contracts';\n\nexport interface PackageMetadata {\n objects?: any[];\n views?: any[];\n apps?: any[];\n flows?: any[];\n agents?: any[];\n tools?: any[];\n translations?: any[];\n}\n\nexport interface PackageRecord {\n id: string;\n version: string;\n manifest: ObjectStackManifest;\n metadata: PackageMetadata;\n hash: string;\n created_at: string;\n updated_at: string;\n}\n\nexport interface PackageService {\n publish(data: { manifest: ObjectStackManifest; metadata: PackageMetadata }): Promise<{ success: boolean; error?: string }>;\n get(packageId: string, version?: string): Promise<PackageRecord | null>;\n list(): Promise<PackageRecord[]>;\n delete(packageId: string, version?: string): Promise<{ success: boolean }>;\n}\n\n/**\n * Normalize the result of `objectql.execute()` into a row array.\n *\n * Different drivers return different shapes for raw SELECT statements:\n * - SQL driver (knex/SQLite) and Turso remote transport return rows\n * directly as an array.\n * - PostgreSQL (knex/pg) returns `{ rows, rowCount, ... }`.\n * - Some drivers may return `{ rows: [...] }` wrappers in other contexts.\n *\n * This helper accepts any of those shapes and always returns an array.\n */\nfunction normalizeRows(result: any): any[] {\n if (Array.isArray(result)) return result;\n if (result && Array.isArray(result.rows)) return result.rows;\n return [];\n}\n\n/**\n * Package Management Service Plugin\n *\n * Provides package publishing, retrieval, and management capabilities.\n * Stores package metadata in the sys.packages table for dynamic loading.\n */\nexport class PackageServicePlugin implements Plugin {\n name = 'package-service';\n\n async init(ctx: PluginContext): Promise<void> {\n // Service will be registered in start() after ObjectQL is available\n ctx.logger.debug('Package service plugin initialized');\n }\n\n async start(ctx: PluginContext): Promise<void> {\n const logger = ctx.logger;\n\n // Get ObjectQL service (available in start() hook after dependencies are initialized)\n const objectql = ctx.getService<IDataEngine>('objectql');\n if (!objectql || !objectql.execute) {\n throw new Error('ObjectQL service with execute() support is required for PackageService');\n }\n\n // Create sys_packages table if it doesn't exist\n try {\n await this.ensureTable(objectql, logger);\n } catch (error) {\n logger.error('Failed to create sys_packages table', error as Error);\n throw error;\n }\n\n // Create the package service\n const packageService: PackageService = {\n async publish(data: { manifest: ObjectStackManifest; metadata: PackageMetadata }) {\n try {\n const hash = createHash('sha256')\n .update(JSON.stringify({ manifest: data.manifest, metadata: data.metadata }))\n .digest('hex');\n\n await objectql.execute!({\n sql: `\n INSERT INTO sys_packages (id, version, manifest, metadata, hash, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)\n ON CONFLICT(id, version) DO UPDATE SET\n manifest = excluded.manifest,\n metadata = excluded.metadata,\n hash = excluded.hash,\n updated_at = CURRENT_TIMESTAMP\n `,\n args: [\n data.manifest.id,\n data.manifest.version,\n JSON.stringify(data.manifest),\n JSON.stringify(data.metadata),\n hash,\n ],\n });\n\n logger.info(`Published package: ${data.manifest.id}@${data.manifest.version}`);\n return { success: true };\n } catch (error) {\n logger.error('Failed to publish package', error as Error);\n return {\n success: false,\n error: (error as Error).message,\n };\n }\n },\n\n async get(packageId: string, version: string = 'latest') {\n try {\n const sql = version === 'latest'\n ? `SELECT * FROM sys_packages WHERE id = ? ORDER BY created_at DESC LIMIT 1`\n : `SELECT * FROM sys_packages WHERE id = ? AND version = ?`;\n\n const args = version === 'latest' ? [packageId] : [packageId, version];\n const result = await objectql.execute!({ sql, args });\n const rows = normalizeRows(result);\n\n if (rows.length === 0) {\n return null;\n }\n\n const row = rows[0];\n return {\n id: row.id,\n version: row.version,\n manifest: JSON.parse(row.manifest),\n metadata: JSON.parse(row.metadata),\n hash: row.hash,\n created_at: row.created_at,\n updated_at: row.updated_at,\n };\n } catch (error) {\n logger.error(`Failed to get package: ${packageId}`, error as Error);\n return null;\n }\n },\n\n async list() {\n try {\n const result = await objectql.execute!({\n sql: `\n SELECT * FROM sys_packages\n WHERE (id, created_at) IN (\n SELECT id, MAX(created_at) FROM sys_packages GROUP BY id\n )\n ORDER BY created_at DESC\n `,\n });\n\n return normalizeRows(result).map((row: any) => ({\n id: row.id,\n version: row.version,\n manifest: JSON.parse(row.manifest),\n metadata: JSON.parse(row.metadata),\n hash: row.hash,\n created_at: row.created_at,\n updated_at: row.updated_at,\n }));\n } catch (error) {\n logger.error('Failed to list packages', error as Error);\n return [];\n }\n },\n\n async delete(packageId: string, version?: string) {\n try {\n const sql = version\n ? `DELETE FROM sys_packages WHERE id = ? AND version = ?`\n : `DELETE FROM sys_packages WHERE id = ?`;\n\n const args = version ? [packageId, version] : [packageId];\n await objectql.execute!({ sql, args });\n\n logger.info(`Deleted package: ${packageId}${version ? `@${version}` : ''}`);\n return { success: true };\n } catch (error) {\n logger.error('Failed to delete package', error as Error);\n return { success: false };\n }\n },\n };\n\n ctx.registerService('package', packageService);\n logger.info('Package service initialized');\n }\n\n private async ensureTable(objectql: IDataEngine, logger: any): Promise<void> {\n try {\n // Create the sys_packages table\n await objectql.execute!({\n sql: `\n CREATE TABLE IF NOT EXISTS sys_packages (\n id TEXT NOT NULL,\n version TEXT NOT NULL,\n manifest TEXT NOT NULL,\n metadata TEXT NOT NULL,\n hash TEXT NOT NULL,\n created_at TEXT DEFAULT CURRENT_TIMESTAMP,\n updated_at TEXT DEFAULT CURRENT_TIMESTAMP,\n PRIMARY KEY (id, version)\n )\n `,\n });\n\n // Create index for faster latest version queries\n await objectql.execute!({\n sql: `\n CREATE INDEX IF NOT EXISTS idx_packages_latest\n ON sys_packages(id, created_at DESC)\n `,\n });\n\n logger.debug('sys_packages table ensured');\n } catch (error) {\n // Table might already exist, log and continue\n logger.debug('sys_packages table creation skipped (may already exist)');\n }\n }\n}\n\nexport { PackageServicePlugin as default };\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@objectstack/service-package",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.5",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "Package management service for ObjectStack — publish, install, and manage packages",
|
|
6
6
|
"type": "module",
|
|
@@ -14,13 +14,13 @@
|
|
|
14
14
|
}
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@objectstack/core": "4.0.
|
|
18
|
-
"@objectstack/spec": "4.0.
|
|
17
|
+
"@objectstack/core": "4.0.5",
|
|
18
|
+
"@objectstack/spec": "4.0.5"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@types/node": "^25.6.
|
|
22
|
-
"typescript": "^6.0.
|
|
23
|
-
"vitest": "^4.1.
|
|
21
|
+
"@types/node": "^25.6.2",
|
|
22
|
+
"typescript": "^6.0.3",
|
|
23
|
+
"vitest": "^4.1.5"
|
|
24
24
|
},
|
|
25
25
|
"keywords": [
|
|
26
26
|
"objectstack",
|