@quereus/plugin-loader 0.1.6 → 0.1.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quereus/plugin-loader",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "type": "module",
5
5
  "description": "Plugin loading system for Quereus - supports dynamic imports for Node.js and browsers",
6
6
  "publisher": "Got Choices Foundation",
@@ -1,41 +0,0 @@
1
- /**
2
- * Configuration loader for Quoomb
3
- * Handles loading, parsing, and interpolating quoomb.config.json files
4
- */
5
- import type { Database } from '@quereus/quereus';
6
- /**
7
- * Plugin configuration from config file
8
- */
9
- export interface PluginConfig {
10
- source: string;
11
- config?: Record<string, any>;
12
- }
13
- /**
14
- * Quoomb configuration file format
15
- */
16
- export interface QuoombConfig {
17
- $schema?: string;
18
- plugins?: PluginConfig[];
19
- autoload?: boolean;
20
- }
21
- /**
22
- * Interpolate environment variables in a value
23
- * Supports ${VAR_NAME} and ${VAR_NAME:-default} syntax
24
- */
25
- export declare function interpolateEnvVars(value: any, env?: Record<string, string>): any;
26
- /**
27
- * Interpolate environment variables in a config object
28
- */
29
- export declare function interpolateConfigEnvVars(config: QuoombConfig, env?: Record<string, string>): QuoombConfig;
30
- /**
31
- * Load plugins from a config object
32
- */
33
- export declare function loadPluginsFromConfig(db: Database, config: QuoombConfig, options?: {
34
- allowCdn?: boolean;
35
- env?: 'auto' | 'browser' | 'node';
36
- }): Promise<void>;
37
- /**
38
- * Validate a config object
39
- */
40
- export declare function validateConfig(config: any): config is QuoombConfig;
41
- //# sourceMappingURL=config-loader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/config-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,kBAAkB,CAAC;AAG3D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,GAAG,CAkBpF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY,CAazG;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAA;CAAE,GAClE,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,IAAI,YAAY,CA2BlE"}
@@ -1,102 +0,0 @@
1
- /**
2
- * Configuration loader for Quoomb
3
- * Handles loading, parsing, and interpolating quoomb.config.json files
4
- */
5
- import { loadPlugin } from './plugin-loader.js';
6
- /**
7
- * Interpolate environment variables in a value
8
- * Supports ${VAR_NAME} and ${VAR_NAME:-default} syntax
9
- */
10
- export function interpolateEnvVars(value, env = {}) {
11
- if (typeof value === 'string') {
12
- return value.replace(/\$\{([^}]+)\}/g, (match, varSpec) => {
13
- const [varName, defaultValue] = varSpec.split(':-');
14
- return env[varName.trim()] ?? defaultValue ?? match;
15
- });
16
- }
17
- if (typeof value === 'object' && value !== null) {
18
- if (Array.isArray(value)) {
19
- return value.map(v => interpolateEnvVars(v, env));
20
- }
21
- const result = {};
22
- for (const [key, val] of Object.entries(value)) {
23
- result[key] = interpolateEnvVars(val, env);
24
- }
25
- return result;
26
- }
27
- return value;
28
- }
29
- /**
30
- * Interpolate environment variables in a config object
31
- */
32
- export function interpolateConfigEnvVars(config, env) {
33
- let envVars = {};
34
- if (env) {
35
- envVars = env;
36
- }
37
- else if (typeof process !== 'undefined' && process.env) {
38
- // Filter out undefined values from process.env
39
- envVars = Object.fromEntries(Object.entries(process.env).filter(([, v]) => v !== undefined));
40
- }
41
- return interpolateEnvVars(config, envVars);
42
- }
43
- /**
44
- * Load plugins from a config object
45
- */
46
- export async function loadPluginsFromConfig(db, config, options) {
47
- if (!config.plugins || config.plugins.length === 0) {
48
- return;
49
- }
50
- for (const pluginConfig of config.plugins) {
51
- try {
52
- const configObj = pluginConfig.config ?? {};
53
- // Convert config values to SqlValue type
54
- const sqlConfig = {};
55
- for (const [key, value] of Object.entries(configObj)) {
56
- if (value === null || value === undefined) {
57
- sqlConfig[key] = null;
58
- }
59
- else if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
60
- sqlConfig[key] = value;
61
- }
62
- else {
63
- // For complex types, convert to JSON string
64
- sqlConfig[key] = JSON.stringify(value);
65
- }
66
- }
67
- await loadPlugin(pluginConfig.source, db, sqlConfig, options);
68
- }
69
- catch (error) {
70
- console.warn(`Warning: Failed to load plugin from ${pluginConfig.source}: ${error instanceof Error ? error.message : 'Unknown error'}`);
71
- }
72
- }
73
- }
74
- /**
75
- * Validate a config object
76
- */
77
- export function validateConfig(config) {
78
- if (typeof config !== 'object' || config === null) {
79
- return false;
80
- }
81
- if (config.plugins !== undefined) {
82
- if (!Array.isArray(config.plugins)) {
83
- return false;
84
- }
85
- for (const plugin of config.plugins) {
86
- if (typeof plugin !== 'object' || plugin === null) {
87
- return false;
88
- }
89
- if (typeof plugin.source !== 'string') {
90
- return false;
91
- }
92
- if (plugin.config !== undefined && typeof plugin.config !== 'object') {
93
- return false;
94
- }
95
- }
96
- }
97
- if (config.autoload !== undefined && typeof config.autoload !== 'boolean') {
98
- return false;
99
- }
100
- return true;
101
- }
102
- //# sourceMappingURL=config-loader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/config-loader.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- /**
2
- * @quereus/plugin-loader
3
- *
4
- * Plugin loading system for Quereus with dynamic import() support.
5
- *
6
- * WARNING: This package uses dynamic import() which is NOT compatible with React Native.
7
- * For React Native environments, use static imports and manual plugin registration instead.
8
- */
9
- export { dynamicLoadModule, validatePluginUrl, loadPlugin } from './plugin-loader.js';
10
- export type { PluginModule, LoadPluginOptions } from './plugin-loader.js';
11
- export type { PluginManifest, PluginRecord, PluginSetting, VTablePluginInfo, FunctionPluginInfo, CollationPluginInfo, TypePluginInfo, PluginRegistrations } from './manifest.js';
12
- export { interpolateEnvVars, interpolateConfigEnvVars, loadPluginsFromConfig, validateConfig } from './config-loader.js';
13
- export type { PluginConfig, QuoombConfig } from './config-loader.js';
14
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACtF,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG1E,YAAY,EACX,cAAc,EACd,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACN,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,cAAc,EACd,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/src/index.js DELETED
@@ -1,13 +0,0 @@
1
- /**
2
- * @quereus/plugin-loader
3
- *
4
- * Plugin loading system for Quereus with dynamic import() support.
5
- *
6
- * WARNING: This package uses dynamic import() which is NOT compatible with React Native.
7
- * For React Native environments, use static imports and manual plugin registration instead.
8
- */
9
- // Re-export plugin loader functions
10
- export { dynamicLoadModule, validatePluginUrl, loadPlugin } from './plugin-loader.js';
11
- // Re-export config loader
12
- export { interpolateEnvVars, interpolateConfigEnvVars, loadPluginsFromConfig, validateConfig } from './config-loader.js';
13
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,oCAAoC;AACpC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAetF,0BAA0B;AAC1B,OAAO,EACN,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,cAAc,EACd,MAAM,oBAAoB,CAAC"}
@@ -1,72 +0,0 @@
1
- import type { SqlValue, FunctionSchema, CollationFunction, TypePluginInfo, VirtualTableModule, VirtualTable } from '@quereus/quereus';
2
- export type { TypePluginInfo };
3
- /**
4
- * Configuration setting definition for a plugin
5
- */
6
- export interface PluginSetting {
7
- key: string;
8
- label: string;
9
- type: 'string' | 'number' | 'boolean' | 'select';
10
- default?: SqlValue;
11
- options?: SqlValue[];
12
- help?: string;
13
- }
14
- /**
15
- * Virtual table module registration info
16
- */
17
- export interface VTablePluginInfo {
18
- name: string;
19
- module: VirtualTableModule<VirtualTable, any>;
20
- auxData?: unknown;
21
- }
22
- /**
23
- * Function registration info
24
- */
25
- export interface FunctionPluginInfo {
26
- schema: FunctionSchema;
27
- }
28
- /**
29
- * Collation registration info
30
- */
31
- export interface CollationPluginInfo {
32
- name: string;
33
- func: CollationFunction;
34
- }
35
- /**
36
- * Plugin registration items - what the plugin wants to register
37
- */
38
- export interface PluginRegistrations {
39
- vtables?: VTablePluginInfo[];
40
- functions?: FunctionPluginInfo[];
41
- collations?: CollationPluginInfo[];
42
- types?: TypePluginInfo[];
43
- }
44
- /**
45
- * Plugin manifest that describes the plugin's metadata and configuration options
46
- */
47
- export interface PluginManifest {
48
- name: string;
49
- version: string;
50
- author?: string;
51
- description?: string;
52
- pragmaPrefix?: string;
53
- settings?: PluginSetting[];
54
- capabilities?: string[];
55
- provides?: {
56
- vtables?: string[];
57
- functions?: string[];
58
- collations?: string[];
59
- types?: string[];
60
- };
61
- }
62
- /**
63
- * Plugin record used for persistence across sessions
64
- */
65
- export interface PluginRecord {
66
- id: string;
67
- url: string;
68
- enabled: boolean;
69
- manifest?: PluginManifest;
70
- config: Record<string, SqlValue>;
71
- }
72
- //# sourceMappingURL=manifest.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,iBAAiB,EAAE,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGtI,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IACjD,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,kBAAkB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,MAAM,EAAE,cAAc,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,iBAAiB,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACjC,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACnC,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAGxB,QAAQ,CAAC,EAAE;QACV,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CACjC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=manifest.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/manifest.ts"],"names":[],"mappings":""}
@@ -1,51 +0,0 @@
1
- import type { Database, SqlValue } from '@quereus/quereus';
2
- import type { PluginManifest, PluginRegistrations } from './manifest.js';
3
- /**
4
- * Plugin module interface - what we expect from a plugin module
5
- */
6
- export interface PluginModule {
7
- /** Default export - the plugin registration function */
8
- default: (db: Database, config?: Record<string, SqlValue>) => Promise<PluginRegistrations> | PluginRegistrations;
9
- }
10
- /**
11
- * Dynamically loads and registers a plugin module
12
- *
13
- * @param url The URL to the ES module (can be https:// or file:// URL)
14
- * @param db The Database instance to register the module with
15
- * @param config Configuration values to pass to the module
16
- * @returns The plugin's manifest if available
17
- */
18
- export declare function dynamicLoadModule(url: string, db: Database, config?: Record<string, SqlValue>): Promise<PluginManifest | undefined>;
19
- /**
20
- * Validates that a URL is likely to be a valid plugin module
21
- *
22
- * @param url The URL to validate
23
- * @returns true if the URL appears valid
24
- */
25
- export declare function validatePluginUrl(url: string): boolean;
26
- /** Loader options for loadPlugin */
27
- export interface LoadPluginOptions {
28
- /**
29
- * Environment hint. Defaults to auto-detection.
30
- * 'browser' enables optional CDN resolution when allowCdn is true.
31
- */
32
- env?: 'auto' | 'browser' | 'node';
33
- /**
34
- * Allow resolving npm: specs to a public CDN in browser contexts.
35
- * Disabled by default (opt-in).
36
- */
37
- allowCdn?: boolean;
38
- /** Which CDN to use when allowCdn is true. Defaults to 'jsdelivr'. */
39
- cdn?: 'jsdelivr' | 'unpkg' | 'esm.sh';
40
- }
41
- /**
42
- * High-level plugin loader that accepts npm specs or direct URLs.
43
- *
44
- * Examples:
45
- * - npm:@scope/quereus-plugin-foo@^1
46
- * - @scope/quereus-plugin-foo (npm package name)
47
- * - https://raw.githubusercontent.com/user/repo/main/plugin.js
48
- * - file:///path/to/plugin.js (Node only)
49
- */
50
- export declare function loadPlugin(spec: string, db: Database, config?: Record<string, SqlValue>, options?: LoadPluginOptions): Promise<PluginManifest | undefined>;
51
- //# sourceMappingURL=plugin-loader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../../src/plugin-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,wDAAwD;IACxD,OAAO,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,OAAO,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CAAC;CACjH;AAqBD;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACtC,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,QAAQ,EACZ,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAM,GACnC,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAyCrC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAkBtD;AAGD,oCAAoC;AACpC,MAAM,WAAW,iBAAiB;IAC9B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sEAAsE;IACtE,GAAG,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;CACzC;AAED;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAC5B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,QAAQ,EACZ,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAM,EACrC,OAAO,GAAE,iBAAsB,GAChC,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAqErC"}
@@ -1,228 +0,0 @@
1
- import { registerPlugin } from '@quereus/quereus';
2
- /**
3
- * Extracts plugin manifest from package.json metadata
4
- * Looks for metadata in package.json root fields and quereus.provides/settings
5
- */
6
- function extractManifestFromPackageJson(pkg) {
7
- const quereus = pkg.quereus || {};
8
- return {
9
- name: pkg.name || 'Unknown Plugin',
10
- version: pkg.version || '0.0.0',
11
- author: pkg.author,
12
- description: pkg.description,
13
- pragmaPrefix: quereus.pragmaPrefix,
14
- settings: quereus.settings,
15
- provides: quereus.provides,
16
- capabilities: quereus.capabilities
17
- };
18
- }
19
- /**
20
- * Dynamically loads and registers a plugin module
21
- *
22
- * @param url The URL to the ES module (can be https:// or file:// URL)
23
- * @param db The Database instance to register the module with
24
- * @param config Configuration values to pass to the module
25
- * @returns The plugin's manifest if available
26
- */
27
- export async function dynamicLoadModule(url, db, config = {}) {
28
- try {
29
- // Add cache-busting timestamp for development
30
- const moduleUrl = new URL(url);
31
- if (moduleUrl.protocol === 'file:' || moduleUrl.hostname === 'localhost') {
32
- moduleUrl.searchParams.set('t', Date.now().toString());
33
- }
34
- // Dynamic import with Vite ignore comment for bundler compatibility
35
- const mod = await import(/* @vite-ignore */ moduleUrl.toString());
36
- // Validate module structure
37
- if (typeof mod.default !== 'function') {
38
- throw new Error(`Module at ${url} has no default export function`);
39
- }
40
- // Use the core registerPlugin function from @quereus/quereus
41
- // This reuses the same registration logic as static plugin loading
42
- await registerPlugin(db, mod.default, config);
43
- console.log(`Successfully loaded plugin from ${url}`);
44
- // Try to extract manifest from package.json
45
- let manifest;
46
- try {
47
- const packageJsonUrl = new URL('package.json', moduleUrl);
48
- const packageJsonResponse = await fetch(packageJsonUrl.toString());
49
- if (packageJsonResponse.ok) {
50
- const pkg = await packageJsonResponse.json();
51
- manifest = extractManifestFromPackageJson(pkg);
52
- }
53
- }
54
- catch {
55
- // package.json not found or not accessible - that's okay
56
- console.log(`Could not load package.json for plugin at ${url}`);
57
- }
58
- return manifest;
59
- }
60
- catch (error) {
61
- const message = error instanceof Error ? error.message : String(error);
62
- throw new Error(`Failed to load plugin from ${url}: ${message}`);
63
- }
64
- }
65
- /**
66
- * Validates that a URL is likely to be a valid plugin module
67
- *
68
- * @param url The URL to validate
69
- * @returns true if the URL appears valid
70
- */
71
- export function validatePluginUrl(url) {
72
- try {
73
- const parsed = new URL(url);
74
- // Allow https:// and file:// protocols
75
- if (!['https:', 'file:'].includes(parsed.protocol)) {
76
- return false;
77
- }
78
- // Must end with .js or .mjs
79
- if (!/\.(m?js)$/i.test(parsed.pathname)) {
80
- return false;
81
- }
82
- return true;
83
- }
84
- catch {
85
- return false;
86
- }
87
- }
88
- /**
89
- * High-level plugin loader that accepts npm specs or direct URLs.
90
- *
91
- * Examples:
92
- * - npm:@scope/quereus-plugin-foo@^1
93
- * - @scope/quereus-plugin-foo (npm package name)
94
- * - https://raw.githubusercontent.com/user/repo/main/plugin.js
95
- * - file:///path/to/plugin.js (Node only)
96
- */
97
- export async function loadPlugin(spec, db, config = {}, options = {}) {
98
- const env = options.env && options.env !== 'auto' ? options.env : (isBrowserEnv() ? 'browser' : 'node');
99
- // Direct URL or file path via dynamicLoadModule
100
- if (isUrlLike(spec)) {
101
- return await dynamicLoadModule(spec, db, config);
102
- }
103
- // Interpret as npm spec or bare package name
104
- const npm = parseNpmSpec(spec);
105
- if (!npm) {
106
- throw new Error(`Invalid plugin spec: ${spec}. Use a URL, file://, or npm package (e.g., npm:@scope/name@version).`);
107
- }
108
- if (env === 'node') {
109
- // Resolve using Node ESM resolution. Prefer exported subpath './plugin'.
110
- const subpathImport = `${npm.name}/plugin${npm.subpath ?? ''}`;
111
- const candidates = [subpathImport, `${npm.name}${npm.subpath ?? ''}`];
112
- let mod;
113
- let lastErr = undefined;
114
- for (const target of candidates) {
115
- try {
116
- mod = await import(/* @vite-ignore */ target);
117
- break;
118
- }
119
- catch (e) {
120
- lastErr = e;
121
- }
122
- }
123
- if (!mod) {
124
- throw new Error(`Failed to resolve plugin package '${npm.name}'. Ensure it exports './plugin' or a default module. Last error: ${lastErr instanceof Error ? lastErr.message : String(lastErr)}`);
125
- }
126
- if (typeof mod.default !== 'function') {
127
- throw new Error(`Resolved module for '${npm.name}' has no default export function`);
128
- }
129
- // Use the core registerPlugin function from @quereus/quereus
130
- await registerPlugin(db, mod.default, config);
131
- console.log(`Successfully loaded plugin from package ${npm.name}`);
132
- // Try to extract manifest from package.json
133
- let manifest;
134
- try {
135
- // Try to import package.json directly
136
- // @vite-ignore - intentional dynamic import for runtime plugin loading
137
- const pkg = await import(/* @vite-ignore */ `${npm.name}/package.json`, { assert: { type: 'json' } });
138
- manifest = extractManifestFromPackageJson(pkg.default);
139
- }
140
- catch {
141
- // package.json not found - that's okay
142
- console.log(`Could not load package.json for plugin ${npm.name}`);
143
- }
144
- return manifest;
145
- }
146
- // Browser path: npm spec requires CDN; only if explicitly allowed
147
- if (!options.allowCdn) {
148
- throw new Error(`Loading npm packages in the browser requires allowCdn=true. Received spec '${spec}'. ` +
149
- `Either provide a direct https:// URL to the ESM plugin or enable CDN resolution.`);
150
- }
151
- const cdnUrl = toCdnUrl(npm, options.cdn ?? 'jsdelivr');
152
- return await dynamicLoadModule(cdnUrl, db, config);
153
- }
154
- function isBrowserEnv() {
155
- // Heuristic: presence of document on globalThis implies browser
156
- return typeof globalThis !== 'undefined' && typeof globalThis.document !== 'undefined';
157
- }
158
- function isUrlLike(s) {
159
- try {
160
- const u = new URL(s);
161
- return u.protocol === 'https:' || u.protocol === 'http:' || u.protocol === 'file:';
162
- }
163
- catch {
164
- return false;
165
- }
166
- }
167
- function parseNpmSpec(input) {
168
- // Remove optional npm: prefix
169
- const raw = input.startsWith('npm:') ? input.slice(4) : input;
170
- // Quick reject if contains spaces or empty
171
- if (!raw || /\s/.test(raw))
172
- return null;
173
- // Support patterns like:
174
- // @scope/name@1.2.3/path name@^1 name name/path
175
- // Split off subpath (first '/' that is not part of scope)
176
- let nameAndVersion = raw;
177
- let subpath;
178
- if (raw.startsWith('@')) {
179
- // Scoped: look for second '/'
180
- const secondSlash = raw.indexOf('/', raw.indexOf('/') + 1);
181
- if (secondSlash !== -1) {
182
- nameAndVersion = raw.slice(0, secondSlash);
183
- subpath = raw.slice(secondSlash);
184
- }
185
- }
186
- else {
187
- const firstSlash = raw.indexOf('/');
188
- if (firstSlash !== -1) {
189
- nameAndVersion = raw.slice(0, firstSlash);
190
- subpath = raw.slice(firstSlash);
191
- }
192
- }
193
- // Now split name@version
194
- const atIndex = nameAndVersion.lastIndexOf('@');
195
- if (nameAndVersion.startsWith('@')) {
196
- // Scoped: the first '@' is part of the scope
197
- if (atIndex > 0) {
198
- const name = nameAndVersion.slice(0, atIndex);
199
- const version = nameAndVersion.slice(atIndex + 1) || undefined;
200
- return { name, version, subpath };
201
- }
202
- return { name: nameAndVersion, subpath };
203
- }
204
- else {
205
- if (atIndex > 0) {
206
- const name = nameAndVersion.slice(0, atIndex);
207
- const version = nameAndVersion.slice(atIndex + 1) || undefined;
208
- return { name, version, subpath };
209
- }
210
- return { name: nameAndVersion, subpath };
211
- }
212
- }
213
- function toCdnUrl(spec, cdn) {
214
- const versionSegment = spec.version ? `@${spec.version}` : '';
215
- const subpath = spec.subpath ? spec.subpath.replace(/^\//, '') : 'plugin';
216
- switch (cdn) {
217
- case 'unpkg':
218
- return `https://unpkg.com/${spec.name}${versionSegment}/${subpath}`;
219
- case 'esm.sh':
220
- // esm.sh expects ?path=/subpath or direct subpath after package
221
- // Use direct subpath; esm.sh will transform to ESM
222
- return `https://esm.sh/${spec.name}${versionSegment}/${subpath}`;
223
- case 'jsdelivr':
224
- default:
225
- return `https://cdn.jsdelivr.net/npm/${spec.name}${versionSegment}/${subpath}`;
226
- }
227
- }
228
- //# sourceMappingURL=plugin-loader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../../src/plugin-loader.ts"],"names":[],"mappings":"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"}