@malloy-publisher/server 0.0.228 → 0.0.230
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/app/api-doc.yaml +102 -10
- package/dist/app/assets/EnvironmentPage-wa_EPkwK.js +1 -0
- package/dist/app/assets/{HomePage-Bkwc9Woc.js → HomePage-jnCrupQp.js} +1 -1
- package/dist/app/assets/{LightMode-Bum_KBpN.js → LightMode-DYbwNULZ.js} +1 -1
- package/dist/app/assets/MainPage-CuJLrPNI.js +2 -0
- package/dist/app/assets/MaterializationsPage-D_67x2ee.js +1 -0
- package/dist/app/assets/ModelPage-D5JtAWqR.js +1 -0
- package/dist/app/assets/PackagePage-BRwtqUSG.js +1 -0
- package/dist/app/assets/{RouteError-DmJLpLXm.js → RouteError-CBNNrnSD.js} +1 -1
- package/dist/app/assets/ThemeEditorPage-CTCeBneA.js +1 -0
- package/dist/app/assets/WorkbookPage-SN6f1RBm.js +1 -0
- package/dist/app/assets/{core-CEDZMHV1.es-_yGzNgNH.js → core-Dp3q5Ieu.es-CD5FvM2s.js} +10 -10
- package/dist/app/assets/{index-CdmFub34.js → index-B3Nn8Vm2.js} +459 -446
- package/dist/app/assets/index-BLCx1EdC.js +18 -0
- package/dist/app/assets/index-C_tJstcx.js +529 -0
- package/dist/app/assets/{index-CE9xhdra.js → index-CfmBVB6M.js} +1 -1
- package/dist/app/assets/{index-OEjKNSYb.js → index-DU4r7GdU.js} +573 -413
- package/dist/app/index.html +1 -1
- package/dist/instrumentation.mjs +1 -1
- package/dist/package_load_worker.mjs +109 -8
- package/dist/server.mjs +7504 -80
- package/package.json +15 -13
- package/scripts/bake-duckdb-extensions.js +5 -2
- package/src/config.spec.ts +87 -1
- package/src/config.ts +142 -1
- package/src/controller/materialization.controller.spec.ts +9 -0
- package/src/controller/materialization.controller.ts +15 -0
- package/src/ducklake_version.spec.ts +163 -0
- package/src/ducklake_version.ts +153 -0
- package/src/errors.ts +12 -0
- package/src/malloy_pin_prereqs.spec.ts +25 -0
- package/src/materialization_metrics.ts +33 -0
- package/src/mcp/skills/build_skills_bundle.ts +29 -9
- package/src/mcp/skills/skills_bundle.json +1 -1
- package/src/mcp/skills/skills_bundle.spec.ts +31 -2
- package/src/query_param_utils.ts +11 -0
- package/src/server.ts +74 -9
- package/src/service/authorize.spec.ts +22 -0
- package/src/service/authorize.ts +267 -10
- package/src/service/authorize_integration.spec.ts +1068 -26
- package/src/service/connection.spec.ts +79 -7
- package/src/service/connection.ts +312 -25
- package/src/service/connection_config.spec.ts +21 -0
- package/src/service/connection_config.ts +15 -1
- package/src/service/cron_evaluator.spec.ts +79 -0
- package/src/service/cron_evaluator.ts +105 -0
- package/src/service/ducklake_lazy_attach.spec.ts +110 -0
- package/src/service/environment.ts +156 -17
- package/src/service/environment_store.spec.ts +569 -14
- package/src/service/environment_store.ts +237 -31
- package/src/service/environment_store_anchoring.spec.ts +107 -0
- package/src/service/extension_fetch_policy.spec.ts +256 -0
- package/src/service/manifest_loader.spec.ts +3 -1
- package/src/service/manifest_loader.ts +9 -5
- package/src/service/materialization_scheduler.spec.ts +289 -0
- package/src/service/materialization_scheduler.ts +304 -0
- package/src/service/materialization_service.spec.ts +286 -5
- package/src/service/materialization_service.ts +121 -8
- package/src/service/materialization_test_fixtures.ts +10 -1
- package/src/service/model.spec.ts +67 -0
- package/src/service/model.ts +656 -31
- package/src/service/package.spec.ts +38 -0
- package/src/service/package.ts +102 -2
- package/src/service/package_quote_bound_tables.spec.ts +171 -0
- package/src/service/persistence_policy.spec.ts +31 -0
- package/src/service/quoting.spec.ts +57 -1
- package/src/service/quoting.ts +33 -0
- package/src/storage/DatabaseInterface.ts +15 -0
- package/src/storage/duckdb/DuckDBRepository.ts +17 -0
- package/src/storage/duckdb/MaterializationRepository.spec.ts +191 -0
- package/src/storage/duckdb/MaterializationRepository.ts +68 -0
- package/tests/fixtures/persist-schedule-test/data/orders.csv +5 -0
- package/tests/fixtures/persist-schedule-test/persist_schedule_test.malloy +11 -0
- package/tests/fixtures/persist-schedule-test/publisher.json +7 -0
- package/tests/fixtures/persist-schedule-warn-test/data/orders.csv +5 -0
- package/tests/fixtures/persist-schedule-warn-test/persist_warn_test.malloy +11 -0
- package/tests/fixtures/persist-schedule-warn-test/publisher.json +6 -0
- package/tests/integration/materialization/environment_list.integration.spec.ts +133 -0
- package/tests/integration/materialization/materialization_lifecycle.integration.spec.ts +7 -2
- package/tests/integration/materialization/orchestrated_rebind.integration.spec.ts +150 -0
- package/tests/integration/materialization/schedule_edit.integration.spec.ts +126 -0
- package/tests/integration/materialization/scheduler.integration.spec.ts +200 -0
- package/tests/integration/materialization/scheduler_recovery.integration.spec.ts +172 -0
- package/tests/integration/materialization/scheduler_transitions.integration.spec.ts +256 -0
- package/tests/integration/materialization/scheduler_wiring.integration.spec.ts +143 -0
- package/dist/app/assets/EnvironmentPage-EW2lbGvb.js +0 -1
- package/dist/app/assets/MainPage-oiEy7TNM.js +0 -2
- package/dist/app/assets/MaterializationsPage-C_VJsTgU.js +0 -1
- package/dist/app/assets/ModelPage-z8REqAmk.js +0 -1
- package/dist/app/assets/PackagePage-C2Vtt1Ln.js +0 -1
- package/dist/app/assets/ThemeEditorPage-BywFjC7A.js +0 -1
- package/dist/app/assets/WorkbookPage-DCMizDMR.js +0 -1
- package/dist/app/assets/index-DDMrjIT3.js +0 -18
- package/dist/app/assets/index-EqslXZ44.js +0 -527
package/dist/app/index.html
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap"
|
|
12
12
|
/>
|
|
13
13
|
<title>Malloy Publisher</title>
|
|
14
|
-
<script type="module" crossorigin src="/assets/index-
|
|
14
|
+
<script type="module" crossorigin src="/assets/index-C_tJstcx.js"></script>
|
|
15
15
|
<link rel="stylesheet" crossorigin href="/assets/index-5eLCcNmP.css">
|
|
16
16
|
</head>
|
|
17
17
|
<body>
|
package/dist/instrumentation.mjs
CHANGED
|
@@ -104941,7 +104941,7 @@ var require_styles = __commonJS((exports, module) => {
|
|
|
104941
104941
|
// ../../node_modules/@colors/colors/lib/system/has-flag.js
|
|
104942
104942
|
var require_has_flag2 = __commonJS((exports, module) => {
|
|
104943
104943
|
module.exports = function(flag, argv) {
|
|
104944
|
-
argv = argv || process.argv;
|
|
104944
|
+
argv = argv || process.argv || [];
|
|
104945
104945
|
var terminatorPos = argv.indexOf("--");
|
|
104946
104946
|
var prefix = /^-{1,2}/.test(flag) ? "" : "--";
|
|
104947
104947
|
var pos = argv.indexOf(prefix + flag);
|
|
@@ -1038,7 +1038,7 @@ var require_styles = __commonJS((exports, module) => {
|
|
|
1038
1038
|
// ../../node_modules/@colors/colors/lib/system/has-flag.js
|
|
1039
1039
|
var require_has_flag = __commonJS((exports, module) => {
|
|
1040
1040
|
module.exports = function(flag, argv) {
|
|
1041
|
-
argv = argv || process.argv;
|
|
1041
|
+
argv = argv || process.argv || [];
|
|
1042
1042
|
var terminatorPos = argv.indexOf("--");
|
|
1043
1043
|
var prefix = /^-{1,2}/.test(flag) ? "" : "--";
|
|
1044
1044
|
var pos = argv.indexOf(prefix + flag);
|
|
@@ -11468,6 +11468,8 @@ function internalErrorToHttpError(error) {
|
|
|
11468
11468
|
return httpError(404, error.message);
|
|
11469
11469
|
} else if (error instanceof ConnectionAuthError) {
|
|
11470
11470
|
return httpError(422, error.message);
|
|
11471
|
+
} else if (error instanceof UnsupportedCatalogFormatError) {
|
|
11472
|
+
return httpError(422, error.message);
|
|
11471
11473
|
} else if (error instanceof ModelCompilationError) {
|
|
11472
11474
|
return httpError(424, error.message);
|
|
11473
11475
|
} else if (error instanceof ConnectionError) {
|
|
@@ -11497,7 +11499,7 @@ function httpError(code, message) {
|
|
|
11497
11499
|
}
|
|
11498
11500
|
};
|
|
11499
11501
|
}
|
|
11500
|
-
var NotImplementedError, BadRequestError, EnvironmentNotFoundError, PackageNotFoundError, ModelNotFoundError, ConnectionNotFoundError, ConnectionError, ConnectionAuthError, ModelCompilationError, FrozenConfigError, AccessDeniedError, NotQueryableError, MaterializationNotFoundError, MaterializationConflictError, InvalidStateTransitionError, ServiceUnavailableError, PayloadTooLargeError, QueryTimeoutError;
|
|
11502
|
+
var NotImplementedError, BadRequestError, EnvironmentNotFoundError, PackageNotFoundError, ModelNotFoundError, ConnectionNotFoundError, ConnectionError, ConnectionAuthError, UnsupportedCatalogFormatError, ModelCompilationError, FrozenConfigError, AccessDeniedError, NotQueryableError, MaterializationNotFoundError, MaterializationConflictError, InvalidStateTransitionError, ServiceUnavailableError, PayloadTooLargeError, QueryTimeoutError;
|
|
11501
11503
|
var init_errors = __esm(() => {
|
|
11502
11504
|
init_constants();
|
|
11503
11505
|
NotImplementedError = class NotImplementedError extends Error {
|
|
@@ -11540,6 +11542,11 @@ var init_errors = __esm(() => {
|
|
|
11540
11542
|
super(message);
|
|
11541
11543
|
}
|
|
11542
11544
|
};
|
|
11545
|
+
UnsupportedCatalogFormatError = class UnsupportedCatalogFormatError extends Error {
|
|
11546
|
+
constructor(message) {
|
|
11547
|
+
super(message);
|
|
11548
|
+
}
|
|
11549
|
+
};
|
|
11543
11550
|
ModelCompilationError = class ModelCompilationError extends Error {
|
|
11544
11551
|
constructor(error) {
|
|
11545
11552
|
super(error.message);
|
|
@@ -11668,24 +11675,95 @@ init_errors();
|
|
|
11668
11675
|
init_errors();
|
|
11669
11676
|
var SOURCE_PREFIX = "#(authorize)";
|
|
11670
11677
|
var FILE_PREFIX = "##(authorize)";
|
|
11671
|
-
function buildAuthorizeProbe(exprs) {
|
|
11678
|
+
function buildAuthorizeProbe(exprs, givenDecls = []) {
|
|
11672
11679
|
const selects = exprs.map((expr, i) => `__auth_${i} is (${expr})`).join(`
|
|
11673
11680
|
`);
|
|
11674
|
-
|
|
11681
|
+
const givenBlock = givenDecls.length > 0 ? `given:
|
|
11682
|
+
${givenDecls.map((g) => ` ${g.name} :: ${g.type}`).join(`
|
|
11683
|
+
`)}
|
|
11684
|
+
|
|
11685
|
+
` : "";
|
|
11686
|
+
return `${givenBlock}run: duckdb.sql("SELECT 1 AS __authorize_probe_row") -> {
|
|
11675
11687
|
select:
|
|
11676
11688
|
${selects}
|
|
11677
11689
|
limit: 1
|
|
11678
11690
|
}`;
|
|
11679
11691
|
}
|
|
11692
|
+
var GIVEN_REF_PATTERN = /\$([A-Za-z_][A-Za-z0-9_]*)/g;
|
|
11693
|
+
var STRING_LITERAL_PATTERN = /'(?:\\.|[^'\\])*'/g;
|
|
11694
|
+
function referencedGivenNames(expr) {
|
|
11695
|
+
const scanned = expr.replace(STRING_LITERAL_PATTERN, "''");
|
|
11696
|
+
const names = [];
|
|
11697
|
+
const seen = new Set;
|
|
11698
|
+
for (const match of scanned.matchAll(GIVEN_REF_PATTERN)) {
|
|
11699
|
+
const name = match[1];
|
|
11700
|
+
if (!seen.has(name)) {
|
|
11701
|
+
seen.add(name);
|
|
11702
|
+
names.push(name);
|
|
11703
|
+
}
|
|
11704
|
+
}
|
|
11705
|
+
return names;
|
|
11706
|
+
}
|
|
11707
|
+
function inferGivenType(value) {
|
|
11708
|
+
if (typeof value === "string")
|
|
11709
|
+
return "string";
|
|
11710
|
+
if (typeof value === "number" || typeof value === "bigint")
|
|
11711
|
+
return "number";
|
|
11712
|
+
if (typeof value === "boolean")
|
|
11713
|
+
return "boolean";
|
|
11714
|
+
if (value instanceof Date)
|
|
11715
|
+
return "timestamp";
|
|
11716
|
+
if (Array.isArray(value)) {
|
|
11717
|
+
if (value.length === 0)
|
|
11718
|
+
return null;
|
|
11719
|
+
const elementType = inferGivenType(value[0]);
|
|
11720
|
+
return elementType ? `${elementType}[]` : null;
|
|
11721
|
+
}
|
|
11722
|
+
return null;
|
|
11723
|
+
}
|
|
11724
|
+
function bindProbeGivens(expr, givens, declaredTypes) {
|
|
11725
|
+
const decls = [];
|
|
11726
|
+
const bound = {};
|
|
11727
|
+
for (const name of referencedGivenNames(expr)) {
|
|
11728
|
+
if (!(name in givens))
|
|
11729
|
+
continue;
|
|
11730
|
+
const value = givens[name];
|
|
11731
|
+
const type = declaredTypes?.get(name) ?? inferGivenType(value);
|
|
11732
|
+
if (!type)
|
|
11733
|
+
continue;
|
|
11734
|
+
decls.push({ name, type });
|
|
11735
|
+
bound[name] = value;
|
|
11736
|
+
}
|
|
11737
|
+
return { decls, bound };
|
|
11738
|
+
}
|
|
11680
11739
|
function isProbeTrue(cell) {
|
|
11681
11740
|
return cell === true || cell === 1 || cell === "true";
|
|
11682
11741
|
}
|
|
11683
|
-
async function
|
|
11742
|
+
async function runProbe(executor, probeText, givens) {
|
|
11743
|
+
const result = await executor.loadQuery(probeText).run({ rowLimit: 1, givens });
|
|
11744
|
+
const row = result?.data?.value?.[0];
|
|
11745
|
+
return !!(row && isProbeTrue(row.__auth_0));
|
|
11746
|
+
}
|
|
11747
|
+
async function evaluateAuthorize(executor, exprs, givens, declaredTypes, options) {
|
|
11748
|
+
const selfContainedFirst = options?.selfContainedFirst ?? false;
|
|
11684
11749
|
for (const expr of exprs) {
|
|
11750
|
+
if (selfContainedFirst) {
|
|
11751
|
+
if (await evaluateSelfContainedFirst(executor, expr, givens, declaredTypes)) {
|
|
11752
|
+
return true;
|
|
11753
|
+
}
|
|
11754
|
+
continue;
|
|
11755
|
+
}
|
|
11685
11756
|
try {
|
|
11686
|
-
|
|
11687
|
-
|
|
11688
|
-
|
|
11757
|
+
if (await runProbe(executor, buildAuthorizeProbe([expr]), givens)) {
|
|
11758
|
+
return true;
|
|
11759
|
+
}
|
|
11760
|
+
continue;
|
|
11761
|
+
} catch {}
|
|
11762
|
+
try {
|
|
11763
|
+
const { decls, bound } = bindProbeGivens(expr, givens, declaredTypes);
|
|
11764
|
+
if (decls.length === 0)
|
|
11765
|
+
continue;
|
|
11766
|
+
if (await runProbe(executor, buildAuthorizeProbe([expr], decls), bound)) {
|
|
11689
11767
|
return true;
|
|
11690
11768
|
}
|
|
11691
11769
|
} catch {
|
|
@@ -11694,6 +11772,29 @@ async function evaluateAuthorize(executor, exprs, givens) {
|
|
|
11694
11772
|
}
|
|
11695
11773
|
return false;
|
|
11696
11774
|
}
|
|
11775
|
+
async function evaluateSelfContainedFirst(executor, expr, givens, declaredTypes) {
|
|
11776
|
+
const referenced = referencedGivenNames(expr);
|
|
11777
|
+
if (referenced.length === 0) {
|
|
11778
|
+
try {
|
|
11779
|
+
return await runProbe(executor, buildAuthorizeProbe([expr]), {});
|
|
11780
|
+
} catch {
|
|
11781
|
+
return false;
|
|
11782
|
+
}
|
|
11783
|
+
}
|
|
11784
|
+
const { decls, bound } = bindProbeGivens(expr, givens, declaredTypes);
|
|
11785
|
+
if (decls.length !== referenced.length) {
|
|
11786
|
+
return false;
|
|
11787
|
+
}
|
|
11788
|
+
try {
|
|
11789
|
+
return await runProbe(executor, buildAuthorizeProbe([expr], decls), bound);
|
|
11790
|
+
} catch {
|
|
11791
|
+
try {
|
|
11792
|
+
return await runProbe(executor, buildAuthorizeProbe([expr]), givens);
|
|
11793
|
+
} catch {
|
|
11794
|
+
return false;
|
|
11795
|
+
}
|
|
11796
|
+
}
|
|
11797
|
+
}
|
|
11697
11798
|
async function validateAuthorizeProbes(compiler, sources) {
|
|
11698
11799
|
for (const source of sources) {
|
|
11699
11800
|
const exprs = source.authorize;
|