@quereus/quereus 0.6.3 → 0.6.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.
Files changed (146) hide show
  1. package/README.md +20 -2
  2. package/dist/src/common/logger.d.ts +59 -0
  3. package/dist/src/common/logger.d.ts.map +1 -1
  4. package/dist/src/common/logger.js +68 -0
  5. package/dist/src/common/logger.js.map +1 -1
  6. package/dist/src/func/builtins/datetime.d.ts.map +1 -1
  7. package/dist/src/func/builtins/datetime.js +10 -5
  8. package/dist/src/func/builtins/datetime.js.map +1 -1
  9. package/dist/src/index.d.ts +5 -6
  10. package/dist/src/index.d.ts.map +1 -1
  11. package/dist/src/index.js +4 -4
  12. package/dist/src/index.js.map +1 -1
  13. package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
  14. package/dist/src/planner/building/constraint-builder.js +4 -0
  15. package/dist/src/planner/building/constraint-builder.js.map +1 -1
  16. package/dist/src/planner/building/delete.d.ts.map +1 -1
  17. package/dist/src/planner/building/delete.js +2 -1
  18. package/dist/src/planner/building/delete.js.map +1 -1
  19. package/dist/src/planner/building/insert.d.ts.map +1 -1
  20. package/dist/src/planner/building/insert.js +4 -1
  21. package/dist/src/planner/building/insert.js.map +1 -1
  22. package/dist/src/planner/building/update.d.ts.map +1 -1
  23. package/dist/src/planner/building/update.js +4 -2
  24. package/dist/src/planner/building/update.js.map +1 -1
  25. package/dist/src/planner/nodes/dml-executor-node.d.ts +8 -2
  26. package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
  27. package/dist/src/planner/nodes/dml-executor-node.js +11 -2
  28. package/dist/src/planner/nodes/dml-executor-node.js.map +1 -1
  29. package/dist/src/planner/validation/determinism-validator.d.ts +29 -0
  30. package/dist/src/planner/validation/determinism-validator.d.ts.map +1 -0
  31. package/dist/src/planner/validation/determinism-validator.js +47 -0
  32. package/dist/src/planner/validation/determinism-validator.js.map +1 -0
  33. package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
  34. package/dist/src/runtime/emit/add-constraint.js +3 -0
  35. package/dist/src/runtime/emit/add-constraint.js.map +1 -1
  36. package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
  37. package/dist/src/runtime/emit/dml-executor.js +84 -8
  38. package/dist/src/runtime/emit/dml-executor.js.map +1 -1
  39. package/dist/src/runtime/types.d.ts +1 -0
  40. package/dist/src/runtime/types.d.ts.map +1 -1
  41. package/dist/src/runtime/types.js.map +1 -1
  42. package/dist/src/schema/manager.d.ts.map +1 -1
  43. package/dist/src/schema/manager.js +41 -0
  44. package/dist/src/schema/manager.js.map +1 -1
  45. package/dist/src/util/ast-stringify.d.ts.map +1 -1
  46. package/dist/src/util/ast-stringify.js +14 -1
  47. package/dist/src/util/ast-stringify.js.map +1 -1
  48. package/dist/src/util/mutation-statement.d.ts +16 -0
  49. package/dist/src/util/mutation-statement.d.ts.map +1 -0
  50. package/dist/src/util/mutation-statement.js +92 -0
  51. package/dist/src/util/mutation-statement.js.map +1 -0
  52. package/dist/src/util/plugin-helper.d.ts +45 -0
  53. package/dist/src/util/plugin-helper.d.ts.map +1 -0
  54. package/dist/src/util/plugin-helper.js +85 -0
  55. package/dist/src/util/plugin-helper.js.map +1 -0
  56. package/dist/src/util/sql-literal.d.ts +11 -0
  57. package/dist/src/util/sql-literal.d.ts.map +1 -0
  58. package/dist/src/util/sql-literal.js +18 -0
  59. package/dist/src/util/sql-literal.js.map +1 -0
  60. package/dist/src/vtab/memory/table.d.ts +1 -2
  61. package/dist/src/vtab/memory/table.d.ts.map +1 -1
  62. package/dist/src/vtab/memory/table.js +3 -3
  63. package/dist/src/vtab/memory/table.js.map +1 -1
  64. package/dist/src/vtab/table.d.ts +23 -5
  65. package/dist/src/vtab/table.d.ts.map +1 -1
  66. package/dist/src/vtab/table.js +6 -0
  67. package/dist/src/vtab/table.js.map +1 -1
  68. package/package.json +4 -2
  69. package/src/common/logger.ts +75 -1
  70. package/src/func/builtins/datetime.ts +10 -5
  71. package/src/index.ts +13 -16
  72. package/src/planner/building/constraint-builder.ts +5 -0
  73. package/src/planner/building/delete.ts +5 -1
  74. package/src/planner/building/insert.ts +8 -1
  75. package/src/planner/building/update.ts +10 -2
  76. package/src/planner/nodes/dml-executor-node.ts +8 -2
  77. package/src/planner/validation/determinism-validator.ts +76 -0
  78. package/src/runtime/emit/add-constraint.ts +3 -0
  79. package/src/runtime/emit/dml-executor.ts +105 -9
  80. package/src/runtime/types.ts +3 -0
  81. package/src/schema/manager.ts +45 -0
  82. package/src/util/ast-stringify.ts +24 -1
  83. package/src/util/hash.ts +90 -90
  84. package/src/util/mutation-statement.ts +129 -0
  85. package/src/util/plugin-helper.ts +110 -0
  86. package/src/util/sql-literal.ts +22 -0
  87. package/src/vtab/memory/table.ts +3 -8
  88. package/src/vtab/table.ts +25 -10
  89. package/dist/src/config/loader.d.ts +0 -41
  90. package/dist/src/config/loader.d.ts.map +0 -1
  91. package/dist/src/config/loader.js +0 -102
  92. package/dist/src/config/loader.js.map +0 -1
  93. package/dist/src/planner/nodes/physical-access-nodes.d.ts +0 -83
  94. package/dist/src/planner/nodes/physical-access-nodes.d.ts.map +0 -1
  95. package/dist/src/planner/nodes/physical-access-nodes.js +0 -226
  96. package/dist/src/planner/nodes/physical-access-nodes.js.map +0 -1
  97. package/dist/src/planner/nodes/scan.d.ts +0 -27
  98. package/dist/src/planner/nodes/scan.d.ts.map +0 -1
  99. package/dist/src/planner/nodes/scan.js +0 -78
  100. package/dist/src/planner/nodes/scan.js.map +0 -1
  101. package/dist/src/planner/nodes/update-executor-node.d.ts +0 -24
  102. package/dist/src/planner/nodes/update-executor-node.d.ts.map +0 -1
  103. package/dist/src/planner/nodes/update-executor-node.js +0 -57
  104. package/dist/src/planner/nodes/update-executor-node.js.map +0 -1
  105. package/dist/src/planner/physical-utils.d.ts +0 -36
  106. package/dist/src/planner/physical-utils.d.ts.map +0 -1
  107. package/dist/src/planner/physical-utils.js +0 -122
  108. package/dist/src/planner/physical-utils.js.map +0 -1
  109. package/dist/src/planner/rules/physical/rule-filter-optimization.d.ts +0 -11
  110. package/dist/src/planner/rules/physical/rule-filter-optimization.d.ts.map +0 -1
  111. package/dist/src/planner/rules/physical/rule-filter-optimization.js +0 -49
  112. package/dist/src/planner/rules/physical/rule-filter-optimization.js.map +0 -1
  113. package/dist/src/planner/rules/physical/rule-mark-physical.d.ts +0 -11
  114. package/dist/src/planner/rules/physical/rule-mark-physical.d.ts.map +0 -1
  115. package/dist/src/planner/rules/physical/rule-mark-physical.js +0 -29
  116. package/dist/src/planner/rules/physical/rule-mark-physical.js.map +0 -1
  117. package/dist/src/planner/rules/physical/rule-project-optimization.d.ts +0 -11
  118. package/dist/src/planner/rules/physical/rule-project-optimization.d.ts.map +0 -1
  119. package/dist/src/planner/rules/physical/rule-project-optimization.js +0 -44
  120. package/dist/src/planner/rules/physical/rule-project-optimization.js.map +0 -1
  121. package/dist/src/planner/rules/physical/rule-sort-optimization.d.ts +0 -11
  122. package/dist/src/planner/rules/physical/rule-sort-optimization.d.ts.map +0 -1
  123. package/dist/src/planner/rules/physical/rule-sort-optimization.js +0 -53
  124. package/dist/src/planner/rules/physical/rule-sort-optimization.js.map +0 -1
  125. package/dist/src/planner/rules/rewrite/rule-constant-folding.d.ts +0 -11
  126. package/dist/src/planner/rules/rewrite/rule-constant-folding.d.ts.map +0 -1
  127. package/dist/src/planner/rules/rewrite/rule-constant-folding.js +0 -59
  128. package/dist/src/planner/rules/rewrite/rule-constant-folding.js.map +0 -1
  129. package/dist/src/planner/util/deferred-constraint.d.ts +0 -14
  130. package/dist/src/planner/util/deferred-constraint.d.ts.map +0 -1
  131. package/dist/src/planner/util/deferred-constraint.js +0 -85
  132. package/dist/src/planner/util/deferred-constraint.js.map +0 -1
  133. package/dist/src/runtime/emit/table-reference.d.ts +0 -5
  134. package/dist/src/runtime/emit/table-reference.d.ts.map +0 -1
  135. package/dist/src/runtime/emit/table-reference.js +0 -67
  136. package/dist/src/runtime/emit/table-reference.js.map +0 -1
  137. package/dist/src/runtime/emit/update-executor.d.ts +0 -5
  138. package/dist/src/runtime/emit/update-executor.d.ts.map +0 -1
  139. package/dist/src/runtime/emit/update-executor.js +0 -54
  140. package/dist/src/runtime/emit/update-executor.js.map +0 -1
  141. package/dist/src/util/plugin-loader.d.ts +0 -52
  142. package/dist/src/util/plugin-loader.d.ts.map +0 -1
  143. package/dist/src/util/plugin-loader.js +0 -307
  144. package/dist/src/util/plugin-loader.js.map +0 -1
  145. package/src/config/loader.ts +0 -140
  146. package/src/util/plugin-loader.ts +0 -387
@@ -1,52 +0,0 @@
1
- import type { Database } from '../core/database.js';
2
- import type { PluginManifest, PluginRegistrations } from '../vtab/manifest.js';
3
- import { type SqlValue } from '../common/types.js';
4
- /**
5
- * Plugin module interface - what we expect from a plugin module
6
- */
7
- export interface PluginModule {
8
- /** Default export - the plugin registration function */
9
- default: (db: Database, config: Record<string, SqlValue>) => Promise<PluginRegistrations> | PluginRegistrations;
10
- }
11
- /**
12
- * Dynamically loads and registers a plugin module
13
- *
14
- * @param url The URL to the ES module (can be https:// or file:// URL)
15
- * @param db The Database instance to register the module with
16
- * @param config Configuration values to pass to the module
17
- * @returns The plugin's manifest if available
18
- */
19
- export declare function dynamicLoadModule(url: string, db: Database, config?: Record<string, SqlValue>): Promise<PluginManifest | undefined>;
20
- /**
21
- * Validates that a URL is likely to be a valid plugin module
22
- *
23
- * @param url The URL to validate
24
- * @returns true if the URL appears valid
25
- */
26
- export declare function validatePluginUrl(url: string): boolean;
27
- /** Loader options for loadPlugin */
28
- export interface LoadPluginOptions {
29
- /**
30
- * Environment hint. Defaults to auto-detection.
31
- * 'browser' enables optional CDN resolution when allowCdn is true.
32
- */
33
- env?: 'auto' | 'browser' | 'node';
34
- /**
35
- * Allow resolving npm: specs to a public CDN in browser contexts.
36
- * Disabled by default (opt-in).
37
- */
38
- allowCdn?: boolean;
39
- /** Which CDN to use when allowCdn is true. Defaults to 'jsdelivr'. */
40
- cdn?: 'jsdelivr' | 'unpkg' | 'esm.sh';
41
- }
42
- /**
43
- * High-level plugin loader that accepts npm specs or direct URLs.
44
- *
45
- * Examples:
46
- * - npm:@scope/quereus-plugin-foo@^1
47
- * - @scope/quereus-plugin-foo (npm package name)
48
- * - https://raw.githubusercontent.com/user/repo/main/plugin.js
49
- * - file:///path/to/plugin.js (Node only)
50
- */
51
- export declare function loadPlugin(spec: string, db: Database, config?: Record<string, SqlValue>, options?: LoadPluginOptions): Promise<PluginManifest | undefined>;
52
- //# sourceMappingURL=plugin-loader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-loader.d.ts","sourceRoot":"","sources":["../../../src/util/plugin-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAM/D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,wDAAwD;IACxD,OAAO,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,OAAO,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CAAC;CAChH;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,CA2DrC;AAsDD;;;;;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,CAqFrC"}
@@ -1,307 +0,0 @@
1
- import { StatusCode } from '../common/types.js';
2
- import { quereusError } from '../common/errors.js';
3
- import { createLogger } from '../common/logger.js';
4
- const log = createLogger('util:plugin-loader');
5
- /**
6
- * Extracts plugin manifest from package.json metadata
7
- * Looks for metadata in package.json root fields and quereus.provides/settings
8
- */
9
- function extractManifestFromPackageJson(pkg) {
10
- const quereus = pkg.quereus || {};
11
- return {
12
- name: pkg.name || 'Unknown Plugin',
13
- version: pkg.version || '0.0.0',
14
- author: pkg.author,
15
- description: pkg.description,
16
- pragmaPrefix: quereus.pragmaPrefix,
17
- settings: quereus.settings,
18
- provides: quereus.provides,
19
- capabilities: quereus.capabilities
20
- };
21
- }
22
- /**
23
- * Dynamically loads and registers a plugin module
24
- *
25
- * @param url The URL to the ES module (can be https:// or file:// URL)
26
- * @param db The Database instance to register the module with
27
- * @param config Configuration values to pass to the module
28
- * @returns The plugin's manifest if available
29
- */
30
- export async function dynamicLoadModule(url, db, config = {}) {
31
- try {
32
- // Add cache-busting timestamp for development
33
- const moduleUrl = new URL(url);
34
- if (moduleUrl.protocol === 'file:' || moduleUrl.hostname === 'localhost') {
35
- moduleUrl.searchParams.set('t', Date.now().toString());
36
- }
37
- // Dynamic import with Vite ignore comment for bundler compatibility
38
- const mod = await import(/* @vite-ignore */ moduleUrl.toString());
39
- // Validate module structure
40
- if (typeof mod.default !== 'function') {
41
- quereusError(`Module at ${url} has no default export function`, StatusCode.FORMAT);
42
- }
43
- // Call the module's register function with the database and config
44
- const registrations = await mod.default(db, config);
45
- // Register all the items the plugin provides
46
- await registerPluginItems(db, registrations);
47
- log('Successfully loaded plugin from %s', url);
48
- if (registrations.vtables?.length) {
49
- log(' Registered %d vtable module(s): %s', registrations.vtables.length, registrations.vtables.map(v => v.name).join(', '));
50
- }
51
- if (registrations.functions?.length) {
52
- log(' Registered %d function(s): %s', registrations.functions.length, registrations.functions.map(f => `${f.schema.name}/${f.schema.numArgs}`).join(', '));
53
- }
54
- if (registrations.collations?.length) {
55
- log(' Registered %d collation(s): %s', registrations.collations.length, registrations.collations.map(c => c.name).join(', '));
56
- }
57
- if (registrations.types?.length) {
58
- log(' Registered %d type(s): %s', registrations.types.length, registrations.types.map(t => t.name).join(', '));
59
- }
60
- // Try to extract manifest from package.json
61
- let manifest;
62
- try {
63
- const packageJsonUrl = new URL('package.json', moduleUrl);
64
- const packageJsonResponse = await fetch(packageJsonUrl.toString());
65
- if (packageJsonResponse.ok) {
66
- const pkg = await packageJsonResponse.json();
67
- manifest = extractManifestFromPackageJson(pkg);
68
- }
69
- }
70
- catch {
71
- // package.json not found or not accessible - that's okay
72
- log('Could not load package.json for plugin at %s', url);
73
- }
74
- return manifest;
75
- }
76
- catch (error) {
77
- const message = error instanceof Error ? error.message : String(error);
78
- quereusError(`Failed to load plugin from ${url}: ${message}`);
79
- }
80
- }
81
- /**
82
- * Registers all items provided by a plugin
83
- *
84
- * @param db Database instance to register with
85
- * @param registrations The items to register
86
- */
87
- async function registerPluginItems(db, registrations) {
88
- // Register virtual table modules
89
- if (registrations.vtables) {
90
- for (const vtable of registrations.vtables) {
91
- try {
92
- db.registerVtabModule(vtable.name, vtable.module, vtable.auxData);
93
- }
94
- catch (error) {
95
- quereusError(`Failed to register vtable module '${vtable.name}': ${error instanceof Error ? error.message : String(error)}`);
96
- }
97
- }
98
- }
99
- // Register functions
100
- if (registrations.functions) {
101
- for (const func of registrations.functions) {
102
- try {
103
- db.registerFunction(func.schema);
104
- }
105
- catch (error) {
106
- quereusError(`Failed to register function '${func.schema.name}/${func.schema.numArgs}': ${error instanceof Error ? error.message : String(error)}`);
107
- }
108
- }
109
- }
110
- // Register collations
111
- if (registrations.collations) {
112
- for (const collation of registrations.collations) {
113
- try {
114
- db.registerCollation(collation.name, collation.func);
115
- }
116
- catch (error) {
117
- quereusError(`Failed to register collation '${collation.name}': ${error instanceof Error ? error.message : String(error)}`);
118
- }
119
- }
120
- }
121
- // Register types
122
- if (registrations.types) {
123
- for (const type of registrations.types) {
124
- try {
125
- db.registerType(type.name, type.definition);
126
- }
127
- catch (error) {
128
- quereusError(`Failed to register type '${type.name}': ${error instanceof Error ? error.message : String(error)}`);
129
- }
130
- }
131
- }
132
- }
133
- /**
134
- * Validates that a URL is likely to be a valid plugin module
135
- *
136
- * @param url The URL to validate
137
- * @returns true if the URL appears valid
138
- */
139
- export function validatePluginUrl(url) {
140
- try {
141
- const parsed = new URL(url);
142
- // Allow https:// and file:// protocols
143
- if (!['https:', 'file:'].includes(parsed.protocol)) {
144
- return false;
145
- }
146
- // Must end with .js or .mjs
147
- if (!/\.(m?js)$/i.test(parsed.pathname)) {
148
- return false;
149
- }
150
- return true;
151
- }
152
- catch {
153
- return false;
154
- }
155
- }
156
- /**
157
- * High-level plugin loader that accepts npm specs or direct URLs.
158
- *
159
- * Examples:
160
- * - npm:@scope/quereus-plugin-foo@^1
161
- * - @scope/quereus-plugin-foo (npm package name)
162
- * - https://raw.githubusercontent.com/user/repo/main/plugin.js
163
- * - file:///path/to/plugin.js (Node only)
164
- */
165
- export async function loadPlugin(spec, db, config = {}, options = {}) {
166
- const env = options.env && options.env !== 'auto' ? options.env : (isBrowserEnv() ? 'browser' : 'node');
167
- // Direct URL or file path via dynamicLoadModule
168
- if (isUrlLike(spec)) {
169
- return await dynamicLoadModule(spec, db, config);
170
- }
171
- // Interpret as npm spec or bare package name
172
- const npm = parseNpmSpec(spec);
173
- if (!npm) {
174
- quereusError(`Invalid plugin spec: ${spec}. Use a URL, file://, or npm package (e.g., npm:@scope/name@version).`, StatusCode.FORMAT);
175
- }
176
- if (env === 'node') {
177
- // Resolve using Node ESM resolution. Prefer exported subpath './plugin'.
178
- const subpathImport = `${npm.name}/plugin${npm.subpath ?? ''}`;
179
- const candidates = [subpathImport, `${npm.name}${npm.subpath ?? ''}`];
180
- let mod;
181
- let lastErr = undefined;
182
- for (const target of candidates) {
183
- try {
184
- mod = await import(/* @vite-ignore */ target);
185
- break;
186
- }
187
- catch (e) {
188
- lastErr = e;
189
- }
190
- }
191
- if (!mod) {
192
- quereusError(`Failed to resolve plugin package '${npm.name}'. Ensure it exports './plugin' or a default module. Last error: ${lastErr instanceof Error ? lastErr.message : String(lastErr)}`);
193
- }
194
- if (typeof mod.default !== 'function') {
195
- quereusError(`Resolved module for '${npm.name}' has no default export function`, StatusCode.FORMAT);
196
- }
197
- const registrations = await mod.default(db, config);
198
- await registerPluginItems(db, registrations);
199
- log('Successfully loaded plugin from package %s', npm.name);
200
- if (registrations.vtables?.length) {
201
- log(' Registered %d vtable module(s): %s', registrations.vtables.length, registrations.vtables.map(v => v.name).join(', '));
202
- }
203
- if (registrations.functions?.length) {
204
- log(' Registered %d function(s): %s', registrations.functions.length, registrations.functions.map(f => `${f.schema.name}/${f.schema.numArgs}`).join(', '));
205
- }
206
- if (registrations.collations?.length) {
207
- log(' Registered %d collation(s): %s', registrations.collations.length, registrations.collations.map(c => c.name).join(', '));
208
- }
209
- if (registrations.types?.length) {
210
- log(' Registered %d type(s): %s', registrations.types.length, registrations.types.map(t => t.name).join(', '));
211
- }
212
- // Try to extract manifest from package.json
213
- let manifest;
214
- try {
215
- // Try to import package.json directly
216
- const pkg = await import(`${npm.name}/package.json`, { assert: { type: 'json' } });
217
- manifest = extractManifestFromPackageJson(pkg.default);
218
- }
219
- catch {
220
- // package.json not found - that's okay
221
- log('Could not load package.json for plugin %s', npm.name);
222
- }
223
- return manifest;
224
- }
225
- // Browser path: npm spec requires CDN; only if explicitly allowed
226
- if (!options.allowCdn) {
227
- quereusError(`Loading npm packages in the browser requires allowCdn=true. Received spec '${spec}'. ` +
228
- `Either provide a direct https:// URL to the ESM plugin or enable CDN resolution.`, StatusCode.MISUSE);
229
- }
230
- const cdnUrl = toCdnUrl(npm, options.cdn ?? 'jsdelivr');
231
- return await dynamicLoadModule(cdnUrl, db, config);
232
- }
233
- function isBrowserEnv() {
234
- // Heuristic: presence of document on globalThis implies browser
235
- return typeof globalThis !== 'undefined' && typeof globalThis.document !== 'undefined';
236
- }
237
- function isUrlLike(s) {
238
- try {
239
- const u = new URL(s);
240
- return u.protocol === 'https:' || u.protocol === 'http:' || u.protocol === 'file:';
241
- }
242
- catch {
243
- return false;
244
- }
245
- }
246
- function parseNpmSpec(input) {
247
- // Remove optional npm: prefix
248
- const raw = input.startsWith('npm:') ? input.slice(4) : input;
249
- // Quick reject if contains spaces or empty
250
- if (!raw || /\s/.test(raw))
251
- return null;
252
- // Support patterns like:
253
- // @scope/name@1.2.3/path name@^1 name name/path
254
- // Split off subpath (first '/' that is not part of scope)
255
- let nameAndVersion = raw;
256
- let subpath;
257
- if (raw.startsWith('@')) {
258
- // Scoped: look for second '/'
259
- const secondSlash = raw.indexOf('/', raw.indexOf('/') + 1);
260
- if (secondSlash !== -1) {
261
- nameAndVersion = raw.slice(0, secondSlash);
262
- subpath = raw.slice(secondSlash);
263
- }
264
- }
265
- else {
266
- const firstSlash = raw.indexOf('/');
267
- if (firstSlash !== -1) {
268
- nameAndVersion = raw.slice(0, firstSlash);
269
- subpath = raw.slice(firstSlash);
270
- }
271
- }
272
- // Now split name@version
273
- const atIndex = nameAndVersion.lastIndexOf('@');
274
- if (nameAndVersion.startsWith('@')) {
275
- // Scoped: the first '@' is part of the scope
276
- if (atIndex > 0) {
277
- const name = nameAndVersion.slice(0, atIndex);
278
- const version = nameAndVersion.slice(atIndex + 1) || undefined;
279
- return { name, version, subpath };
280
- }
281
- return { name: nameAndVersion, subpath };
282
- }
283
- else {
284
- if (atIndex > 0) {
285
- const name = nameAndVersion.slice(0, atIndex);
286
- const version = nameAndVersion.slice(atIndex + 1) || undefined;
287
- return { name, version, subpath };
288
- }
289
- return { name: nameAndVersion, subpath };
290
- }
291
- }
292
- function toCdnUrl(spec, cdn) {
293
- const versionSegment = spec.version ? `@${spec.version}` : '';
294
- const subpath = spec.subpath ? spec.subpath.replace(/^\//, '') : 'plugin';
295
- switch (cdn) {
296
- case 'unpkg':
297
- return `https://unpkg.com/${spec.name}${versionSegment}/${subpath}`;
298
- case 'esm.sh':
299
- // esm.sh expects ?path=/subpath or direct subpath after package
300
- // Use direct subpath; esm.sh will transform to ESM
301
- return `https://esm.sh/${spec.name}${versionSegment}/${subpath}`;
302
- case 'jsdelivr':
303
- default:
304
- return `https://cdn.jsdelivr.net/npm/${spec.name}${versionSegment}/${subpath}`;
305
- }
306
- }
307
- //# sourceMappingURL=plugin-loader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-loader.js","sourceRoot":"","sources":["../../../src/util/plugin-loader.ts"],"names":[],"mappings":"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"}
@@ -1,140 +0,0 @@
1
- /**
2
- * Configuration loader for Quoomb
3
- * Handles loading, parsing, and interpolating quoomb.config.json files
4
- */
5
-
6
- import type { Database } from '../core/database.js';
7
- import type { SqlValue } from '../common/types.js';
8
- import { loadPlugin } from '../util/plugin-loader.js';
9
-
10
- /**
11
- * Plugin configuration from config file
12
- */
13
- export interface PluginConfig {
14
- source: string;
15
- config?: Record<string, any>;
16
- }
17
-
18
- /**
19
- * Quoomb configuration file format
20
- */
21
- export interface QuoombConfig {
22
- $schema?: string;
23
- plugins?: PluginConfig[];
24
- autoload?: boolean;
25
- }
26
-
27
- /**
28
- * Interpolate environment variables in a value
29
- * Supports ${VAR_NAME} and ${VAR_NAME:-default} syntax
30
- */
31
- export function interpolateEnvVars(value: any, env: Record<string, string> = {}): any {
32
- if (typeof value === 'string') {
33
- return value.replace(/\$\{([^}]+)\}/g, (match, varSpec) => {
34
- const [varName, defaultValue] = varSpec.split(':-');
35
- return env[varName.trim()] ?? defaultValue ?? match;
36
- });
37
- }
38
- if (typeof value === 'object' && value !== null) {
39
- if (Array.isArray(value)) {
40
- return value.map(v => interpolateEnvVars(v, env));
41
- }
42
- const result: Record<string, any> = {};
43
- for (const [key, val] of Object.entries(value)) {
44
- result[key] = interpolateEnvVars(val, env);
45
- }
46
- return result;
47
- }
48
- return value;
49
- }
50
-
51
- /**
52
- * Interpolate environment variables in a config object
53
- */
54
- export function interpolateConfigEnvVars(config: QuoombConfig, env?: Record<string, string>): QuoombConfig {
55
- let envVars: Record<string, string> = {};
56
-
57
- if (env) {
58
- envVars = env;
59
- } else if (typeof process !== 'undefined' && process.env) {
60
- // Filter out undefined values from process.env
61
- envVars = Object.fromEntries(
62
- Object.entries(process.env).filter(([, v]) => v !== undefined) as Array<[string, string]>
63
- );
64
- }
65
-
66
- return interpolateEnvVars(config, envVars);
67
- }
68
-
69
- /**
70
- * Load plugins from a config object
71
- */
72
- export async function loadPluginsFromConfig(
73
- db: Database,
74
- config: QuoombConfig,
75
- options?: { allowCdn?: boolean; env?: 'auto' | 'browser' | 'node' }
76
- ): Promise<void> {
77
- if (!config.plugins || config.plugins.length === 0) {
78
- return;
79
- }
80
-
81
- for (const pluginConfig of config.plugins) {
82
- try {
83
- const configObj = pluginConfig.config ?? {};
84
-
85
- // Convert config values to SqlValue type
86
- const sqlConfig: Record<string, SqlValue> = {};
87
- for (const [key, value] of Object.entries(configObj)) {
88
- if (value === null || value === undefined) {
89
- sqlConfig[key] = null;
90
- } else if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
91
- sqlConfig[key] = value;
92
- } else {
93
- // For complex types, convert to JSON string
94
- sqlConfig[key] = JSON.stringify(value);
95
- }
96
- }
97
-
98
- await loadPlugin(pluginConfig.source, db, sqlConfig, options);
99
- } catch (error) {
100
- console.warn(
101
- `Warning: Failed to load plugin from ${pluginConfig.source}: ${
102
- error instanceof Error ? error.message : 'Unknown error'
103
- }`
104
- );
105
- }
106
- }
107
- }
108
-
109
- /**
110
- * Validate a config object
111
- */
112
- export function validateConfig(config: any): config is QuoombConfig {
113
- if (typeof config !== 'object' || config === null) {
114
- return false;
115
- }
116
-
117
- if (config.plugins !== undefined) {
118
- if (!Array.isArray(config.plugins)) {
119
- return false;
120
- }
121
- for (const plugin of config.plugins) {
122
- if (typeof plugin !== 'object' || plugin === null) {
123
- return false;
124
- }
125
- if (typeof plugin.source !== 'string') {
126
- return false;
127
- }
128
- if (plugin.config !== undefined && typeof plugin.config !== 'object') {
129
- return false;
130
- }
131
- }
132
- }
133
-
134
- if (config.autoload !== undefined && typeof config.autoload !== 'boolean') {
135
- return false;
136
- }
137
-
138
- return true;
139
- }
140
-