@malloy-publisher/server 0.0.235 → 0.0.237
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 +83 -27
- package/dist/app/assets/{EnvironmentPage-BsAnavYN.js → EnvironmentPage-DaP6CpgK.js} +1 -1
- package/dist/app/assets/{HomePage-CADE138j.js → HomePage-C9yNw3iu.js} +1 -1
- package/dist/app/assets/{LightMode-Cfh7KzN8.js → LightMode-Be4-G-dX.js} +1 -1
- package/dist/app/assets/{MainPage-CO3pRlnV.js → MainPage-J_rU2SgI.js} +2 -2
- package/dist/app/assets/{MaterializationsPage-p9YjkRXZ.js → MaterializationsPage-DHgPI4MO.js} +1 -1
- package/dist/app/assets/ModelPage-BzXfjTu5.js +1 -0
- package/dist/app/assets/{PackagePage-e4kN75YR.js → PackagePage-ByoSTLJ4.js} +1 -1
- package/dist/app/assets/RouteError-CrSeKN2r.js +1 -0
- package/dist/app/assets/{ThemeEditorPage-CciagFTq.js → ThemeEditorPage-Btxnmhtk.js} +1 -1
- package/dist/app/assets/{WorkbookPage-DNWmkCXa.js → WorkbookPage-D6JLPnWO.js} +1 -1
- package/dist/app/assets/{core-Rj_4rRnA.es-BZyvITuO.js → core-BSRgt1mG.es-Bc_D2Lq4.js} +1 -1
- package/dist/app/assets/{index-CH2AcDzc.js → index-BRijWj6K.js} +15 -15
- package/dist/app/assets/{index-DQa463gC.js → index-BX4D94xw.js} +1 -1
- package/dist/app/assets/{index-VBbcc8s6.js → index-Cvy0xtb7.js} +1 -1
- package/dist/app/assets/{index-DQpV7MyA.js → index-DMAhIJNC.js} +1 -1
- package/dist/app/index.html +1 -1
- package/dist/package_load_worker.mjs +59 -20
- package/dist/server.mjs +1342 -616
- package/package.json +8 -2
- package/.eslintrc.json +0 -44
- package/.prettierignore +0 -1
- package/.prettierrc +0 -4
- package/build.ts +0 -97
- package/dist/app/assets/ModelPage-C1OSTv-x.js +0 -1
- package/dist/app/assets/RouteError-CzbfOkng.js +0 -1
- package/eslint.config.mjs +0 -76
- package/k6-tests/README.md +0 -144
- package/k6-tests/bun.lock +0 -797
- package/k6-tests/load-test/load-test-crud-connections.ts +0 -263
- package/k6-tests/load-test/load-test-crud-packages.ts +0 -461
- package/k6-tests/load-test/load-test-crud-projects.ts +0 -160
- package/k6-tests/load-test/load-test-crud.ts +0 -142
- package/k6-tests/load-test/load-test.ts +0 -784
- package/k6-tests/package.json +0 -27
- package/k6-tests/scripts/run-with-otel.sh +0 -50
- package/k6-tests/smoke-test/smoke-test.ts +0 -158
- package/k6-tests/tsconfig.json +0 -29
- package/k6-tests/utils/client_factory.ts +0 -128
- package/k6-tests/utils/common.ts +0 -489
- package/k6-tests/utils/logger.ts +0 -62
- package/k6-tests/utils/types.d.ts +0 -35
- package/malloy_mcp.dxt +0 -0
- package/publisher.config.example.bigquery.json +0 -33
- package/publisher.config.example.duckdb.json +0 -23
- package/publisher.config.json +0 -23
- package/scripts/bake-duckdb-extensions.js +0 -110
- package/src/config.spec.ts +0 -1535
- package/src/config.theme.spec.ts +0 -178
- package/src/config.ts +0 -1142
- package/src/constants.ts +0 -105
- package/src/controller/compile.controller.ts +0 -40
- package/src/controller/connection.controller.spec.ts +0 -849
- package/src/controller/connection.controller.ts +0 -901
- package/src/controller/database.controller.ts +0 -24
- package/src/controller/materialization.controller.spec.ts +0 -293
- package/src/controller/materialization.controller.ts +0 -319
- package/src/controller/model.controller.ts +0 -164
- package/src/controller/package.controller.spec.ts +0 -273
- package/src/controller/package.controller.ts +0 -306
- package/src/controller/query.controller.ts +0 -152
- package/src/controller/theme.controller.ts +0 -83
- package/src/controller/watch-mode.controller.ts +0 -243
- package/src/data_styles.ts +0 -71
- package/src/default-publisher.config.json +0 -23
- package/src/ducklake_version.spec.ts +0 -163
- package/src/ducklake_version.ts +0 -153
- package/src/errors.spec.ts +0 -119
- package/src/errors.ts +0 -237
- package/src/filter_deprecation.spec.ts +0 -64
- package/src/filter_deprecation.ts +0 -42
- package/src/health.spec.ts +0 -123
- package/src/health.ts +0 -233
- package/src/heap_check.spec.ts +0 -144
- package/src/heap_check.ts +0 -144
- package/src/instrumentation.ts +0 -214
- package/src/json_utils.spec.ts +0 -51
- package/src/json_utils.ts +0 -33
- package/src/logger.spec.ts +0 -210
- package/src/logger.ts +0 -251
- package/src/malloy_pin_prereqs.spec.ts +0 -25
- package/src/materialization_metrics.spec.ts +0 -169
- package/src/materialization_metrics.ts +0 -346
- package/src/mcp/error_messages.spec.ts +0 -35
- package/src/mcp/error_messages.ts +0 -183
- package/src/mcp/handler_utils.spec.ts +0 -108
- package/src/mcp/handler_utils.ts +0 -251
- package/src/mcp/mcp_constants.ts +0 -6
- package/src/mcp/query_envelope.spec.ts +0 -229
- package/src/mcp/query_envelope.ts +0 -240
- package/src/mcp/server.protocol.spec.ts +0 -250
- package/src/mcp/server.ts +0 -87
- package/src/mcp/skills/build_skills_bundle.spec.ts +0 -51
- package/src/mcp/skills/build_skills_bundle.ts +0 -176
- package/src/mcp/skills/skills_bundle.json +0 -1
- package/src/mcp/skills/skills_bundle.spec.ts +0 -171
- package/src/mcp/tool_response.spec.ts +0 -108
- package/src/mcp/tool_response.ts +0 -138
- package/src/mcp/tools/compile_tool.spec.ts +0 -315
- package/src/mcp/tools/compile_tool.ts +0 -208
- package/src/mcp/tools/docs_search/build_docs_index.ts +0 -132
- package/src/mcp/tools/docs_search/malloy_docs_index.json +0 -1
- package/src/mcp/tools/docs_search_tool.spec.ts +0 -32
- package/src/mcp/tools/docs_search_tool.ts +0 -128
- package/src/mcp/tools/embedding_index.spec.ts +0 -1236
- package/src/mcp/tools/embedding_index.ts +0 -808
- package/src/mcp/tools/execute_query_tool.spec.ts +0 -294
- package/src/mcp/tools/execute_query_tool.ts +0 -316
- package/src/mcp/tools/get_context_eval.ts +0 -275
- package/src/mcp/tools/get_context_tool.spec.ts +0 -592
- package/src/mcp/tools/get_context_tool.ts +0 -585
- package/src/mcp/tools/reload_package_tool.spec.ts +0 -232
- package/src/mcp/tools/reload_package_tool.ts +0 -132
- package/src/mcp_config.spec.ts +0 -919
- package/src/mcp_config.ts +0 -425
- package/src/oom_guards.integration.spec.ts +0 -269
- package/src/package_load/package_load_pool.spec.ts +0 -252
- package/src/package_load/package_load_pool.ts +0 -931
- package/src/package_load/package_load_worker.ts +0 -1034
- package/src/package_load/protocol.ts +0 -364
- package/src/package_load/rpc_wait_accountant.spec.ts +0 -109
- package/src/package_load/rpc_wait_accountant.ts +0 -76
- package/src/package_load_metrics.spec.ts +0 -114
- package/src/package_load_metrics.ts +0 -127
- package/src/path_safety.spec.ts +0 -158
- package/src/path_safety.ts +0 -146
- package/src/pg_helpers.spec.ts +0 -223
- package/src/pg_helpers.ts +0 -52
- package/src/query_cap_metrics.spec.ts +0 -89
- package/src/query_cap_metrics.ts +0 -116
- package/src/query_concurrency.spec.ts +0 -247
- package/src/query_concurrency.ts +0 -237
- package/src/query_metadata_metrics.ts +0 -49
- package/src/query_param_utils.ts +0 -29
- package/src/query_timeout.spec.ts +0 -224
- package/src/query_timeout.ts +0 -179
- package/src/runtime/publisher.js +0 -328
- package/src/server-old.ts +0 -988
- package/src/server.ts +0 -2059
- package/src/service/annotations.spec.ts +0 -118
- package/src/service/annotations.ts +0 -91
- package/src/service/authorize.spec.ts +0 -154
- package/src/service/authorize.ts +0 -498
- package/src/service/authorize_integration.spec.ts +0 -2041
- package/src/service/build_plan.spec.ts +0 -685
- package/src/service/build_plan.ts +0 -797
- package/src/service/compile_authorize.spec.ts +0 -85
- package/src/service/compile_fragment_techniques.spec.ts +0 -156
- package/src/service/connection.spec.ts +0 -2360
- package/src/service/connection.ts +0 -2187
- package/src/service/connection_config.spec.ts +0 -734
- package/src/service/connection_config.ts +0 -899
- package/src/service/connection_federation.spec.ts +0 -184
- package/src/service/connection_fingerprint.spec.ts +0 -102
- package/src/service/connection_service.spec.ts +0 -711
- package/src/service/connection_service.ts +0 -291
- package/src/service/cron_evaluator.spec.ts +0 -79
- package/src/service/cron_evaluator.ts +0 -105
- package/src/service/db_utils.spec.ts +0 -1085
- package/src/service/db_utils.ts +0 -1502
- package/src/service/duckdb_instance_isolation.spec.ts +0 -137
- package/src/service/ducklake_lazy_attach.spec.ts +0 -110
- package/src/service/embedding_provider.spec.ts +0 -329
- package/src/service/embedding_provider.ts +0 -236
- package/src/service/environment.ts +0 -2191
- package/src/service/environment_admission.spec.ts +0 -344
- package/src/service/environment_compile.spec.ts +0 -197
- package/src/service/environment_store.spec.ts +0 -2274
- package/src/service/environment_store.ts +0 -2434
- package/src/service/environment_store_anchoring.spec.ts +0 -107
- package/src/service/environment_store_clone.spec.ts +0 -350
- package/src/service/explore_visibility.spec.ts +0 -434
- package/src/service/exports_probe.spec.ts +0 -107
- package/src/service/extension_fetch_policy.spec.ts +0 -256
- package/src/service/filter.spec.ts +0 -458
- package/src/service/filter.ts +0 -341
- package/src/service/filter_bypass.spec.ts +0 -418
- package/src/service/filter_integration.spec.ts +0 -1004
- package/src/service/freshness.spec.ts +0 -183
- package/src/service/freshness.ts +0 -112
- package/src/service/gcs_s3_utils.ts +0 -427
- package/src/service/given.ts +0 -105
- package/src/service/givens_integration.spec.ts +0 -219
- package/src/service/manifest_loader.spec.ts +0 -189
- package/src/service/manifest_loader.ts +0 -156
- package/src/service/materialization_build_session.spec.ts +0 -435
- package/src/service/materialization_build_session.ts +0 -681
- package/src/service/materialization_config_validation.spec.ts +0 -99
- package/src/service/materialization_config_validation.ts +0 -120
- package/src/service/materialization_eligibility.spec.ts +0 -158
- package/src/service/materialization_eligibility.ts +0 -305
- package/src/service/materialization_schedule_surface.spec.ts +0 -256
- package/src/service/materialization_scheduler.spec.ts +0 -289
- package/src/service/materialization_scheduler.ts +0 -304
- package/src/service/materialization_serve_transform.spec.ts +0 -1003
- package/src/service/materialization_serve_transform.ts +0 -779
- package/src/service/materialization_service.spec.ts +0 -2373
- package/src/service/materialization_service.ts +0 -2342
- package/src/service/materialization_test_fixtures.ts +0 -249
- package/src/service/model.spec.ts +0 -1157
- package/src/service/model.ts +0 -3370
- package/src/service/model_limits.spec.ts +0 -209
- package/src/service/model_limits.ts +0 -131
- package/src/service/model_storage_serve.spec.ts +0 -193
- package/src/service/model_storage_serve_joins.spec.ts +0 -193
- package/src/service/package.spec.ts +0 -612
- package/src/service/package.ts +0 -1799
- package/src/service/package_manifest.spec.ts +0 -230
- package/src/service/package_manifest.ts +0 -241
- package/src/service/package_memory_governor.spec.ts +0 -173
- package/src/service/package_memory_governor.ts +0 -233
- package/src/service/package_quote_bound_tables.spec.ts +0 -171
- package/src/service/package_race.spec.ts +0 -208
- package/src/service/package_reload_safety.spec.ts +0 -193
- package/src/service/package_rollback.spec.ts +0 -190
- package/src/service/package_worker_path.spec.ts +0 -645
- package/src/service/path_injection.spec.ts +0 -39
- package/src/service/persist_annotation_validation.spec.ts +0 -89
- package/src/service/persist_annotation_validation.ts +0 -59
- package/src/service/persistence_policy.spec.ts +0 -374
- package/src/service/proxy.spec.ts +0 -414
- package/src/service/proxy.ts +0 -248
- package/src/service/query_boundary.spec.ts +0 -470
- package/src/service/query_metadata.spec.ts +0 -408
- package/src/service/query_metadata.ts +0 -492
- package/src/service/query_metadata_identity.spec.ts +0 -149
- package/src/service/query_text.spec.ts +0 -79
- package/src/service/query_text.ts +0 -43
- package/src/service/quoting.spec.ts +0 -135
- package/src/service/quoting.ts +0 -78
- package/src/service/resolve_environment.ts +0 -15
- package/src/service/restricted_mode.spec.ts +0 -299
- package/src/service/source_extraction.ts +0 -225
- package/src/service/theme_store.ts +0 -199
- package/src/storage/DatabaseInterface.ts +0 -198
- package/src/storage/StorageManager.ts +0 -113
- package/src/storage/duckdb/ConnectionRepository.ts +0 -143
- package/src/storage/duckdb/DuckDBConnection.ts +0 -123
- package/src/storage/duckdb/DuckDBRepository.ts +0 -208
- package/src/storage/duckdb/EnvironmentRepository.ts +0 -148
- package/src/storage/duckdb/MaterializationRepository.spec.ts +0 -191
- package/src/storage/duckdb/MaterializationRepository.ts +0 -336
- package/src/storage/duckdb/PackageRepository.ts +0 -135
- package/src/storage/duckdb/schema.ts +0 -229
- package/src/stream_helpers.spec.ts +0 -280
- package/src/stream_helpers.ts +0 -162
- package/src/telemetry.ts +0 -20
- package/src/test_helpers/metrics_harness.ts +0 -166
- package/src/theme_key_parity.spec.ts +0 -57
- package/src/utils.ts +0 -29
- package/tests/fixtures/authorize-compile/model.malloy +0 -9
- package/tests/fixtures/authorize-compile/publisher.json +0 -4
- package/tests/fixtures/html-pages-nopublic/model.malloy +0 -1
- package/tests/fixtures/html-pages-nopublic/publisher.json +0 -5
- package/tests/fixtures/html-pages-test/data.csv +0 -3
- package/tests/fixtures/html-pages-test/public/assets/app.css +0 -3
- package/tests/fixtures/html-pages-test/public/barehtml.html +0 -4
- package/tests/fixtures/html-pages-test/public/bodymeta.html +0 -8
- package/tests/fixtures/html-pages-test/public/data.json +0 -1
- package/tests/fixtures/html-pages-test/public/fitcomment.html +0 -11
- package/tests/fixtures/html-pages-test/public/index.html +0 -9
- package/tests/fixtures/html-pages-test/public/nohead.html +0 -8
- package/tests/fixtures/html-pages-test/public/notfit.html +0 -13
- package/tests/fixtures/html-pages-test/public/slides.html +0 -12
- package/tests/fixtures/html-pages-test/public/sub/page2.html +0 -9
- package/tests/fixtures/html-pages-test/public/unterminated.html +0 -10
- package/tests/fixtures/html-pages-test/publisher.json +0 -5
- package/tests/fixtures/html-pages-test/report.malloy +0 -1
- package/tests/fixtures/persist-multi-level/data/orders.csv +0 -5
- package/tests/fixtures/persist-multi-level/multi_level.malloy +0 -18
- package/tests/fixtures/persist-multi-level/publisher.json +0 -5
- package/tests/fixtures/persist-schedule-test/data/orders.csv +0 -5
- package/tests/fixtures/persist-schedule-test/persist_schedule_test.malloy +0 -11
- package/tests/fixtures/persist-schedule-test/publisher.json +0 -7
- package/tests/fixtures/persist-schedule-warn-test/data/orders.csv +0 -5
- package/tests/fixtures/persist-schedule-warn-test/persist_warn_test.malloy +0 -11
- package/tests/fixtures/persist-schedule-warn-test/publisher.json +0 -6
- package/tests/fixtures/persist-test/data/orders.csv +0 -5
- package/tests/fixtures/persist-test/persist_test.malloy +0 -11
- package/tests/fixtures/persist-test/publisher.json +0 -5
- package/tests/fixtures/publisher.config.json +0 -15
- package/tests/fixtures/query-givens/data/orders.csv +0 -7
- package/tests/fixtures/query-givens/model.malloy +0 -34
- package/tests/fixtures/query-givens/publisher.json +0 -5
- package/tests/fixtures/xlsx/database.xlsx +0 -0
- package/tests/harness/mcp_test_setup.ts +0 -332
- package/tests/harness/rest_e2e.ts +0 -68
- package/tests/integration/authorize/compile_authorize_http.integration.spec.ts +0 -92
- package/tests/integration/concurrent_package/concurrent_package.integration.spec.ts +0 -280
- package/tests/integration/duckdb_storage/duckdb_storage.integration.spec.ts +0 -138
- package/tests/integration/first_boot/readiness_line.integration.spec.ts +0 -177
- package/tests/integration/html_pages/html_pages.integration.spec.ts +0 -440
- package/tests/integration/legacy_routes/legacy_routes.integration.spec.ts +0 -259
- package/tests/integration/materialization/environment_list.integration.spec.ts +0 -133
- package/tests/integration/materialization/freshness_gate.integration.spec.ts +0 -292
- package/tests/integration/materialization/manifest_binding.integration.spec.ts +0 -430
- package/tests/integration/materialization/materialization_lifecycle.integration.spec.ts +0 -441
- package/tests/integration/materialization/orchestrated_rebind.integration.spec.ts +0 -150
- package/tests/integration/materialization/reference_manifest.integration.spec.ts +0 -251
- package/tests/integration/materialization/schedule_edit.integration.spec.ts +0 -126
- package/tests/integration/materialization/scheduler.integration.spec.ts +0 -200
- package/tests/integration/materialization/scheduler_recovery.integration.spec.ts +0 -172
- package/tests/integration/materialization/scheduler_transitions.integration.spec.ts +0 -256
- package/tests/integration/materialization/scheduler_wiring.integration.spec.ts +0 -143
- package/tests/integration/mcp/mcp_execute_query_tool.integration.spec.ts +0 -438
- package/tests/integration/mcp/mcp_get_context_semantic.integration.spec.ts +0 -235
- package/tests/integration/mcp/mcp_transport.integration.spec.ts +0 -98
- package/tests/integration/query_givens/query_givens.integration.spec.ts +0 -146
- package/tests/integration/query_givens/query_givens_authorize.integration.spec.ts +0 -121
- package/tests/integration/sdk_givens/sdk_givens.integration.spec.ts +0 -110
- package/tests/integration/watch-mode/watch_mode.integration.spec.ts +0 -421
- package/tests/unit/controller/theme.controller.spec.ts +0 -141
- package/tests/unit/duckdb/attached_databases.test.ts +0 -1243
- package/tests/unit/duckdb/duckdb_connection.test.ts +0 -181
- package/tests/unit/duckdb/legacy_schema_migration.test.ts +0 -197
- package/tests/unit/duckdb/repositories.test.ts +0 -208
- package/tests/unit/ducklake/ducklake.test.ts +0 -952
- package/tests/unit/service/theme_store.spec.ts +0 -139
- package/tsconfig.json +0 -32
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it } from "bun:test";
|
|
2
|
-
import fs from "fs/promises";
|
|
3
|
-
import os from "os";
|
|
4
|
-
import path from "path";
|
|
5
|
-
import { AccessDeniedError } from "../errors";
|
|
6
|
-
import { Environment } from "./environment";
|
|
7
|
-
|
|
8
|
-
// End-to-end gate on the /compile path. Exercises environment.compileSource
|
|
9
|
-
// through a real installed package, not just the Model primitives — pins that
|
|
10
|
-
// the early gate AND the compiled-source backstop fire, the latter REGARDLESS of
|
|
11
|
-
// includeSql (a compile-time schema oracle is closed even with no SQL extraction).
|
|
12
|
-
|
|
13
|
-
const PUBLISHER_JSON = JSON.stringify({
|
|
14
|
-
name: "pkg",
|
|
15
|
-
description: "compile-gate",
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
// `gated` is locked to $ROLE='analyst'; `open_src` is unrestricted.
|
|
19
|
-
const MODEL = `##! experimental.givens
|
|
20
|
-
|
|
21
|
-
given:
|
|
22
|
-
ROLE :: string
|
|
23
|
-
|
|
24
|
-
#(authorize) "$ROLE = 'analyst'"
|
|
25
|
-
source: gated is duckdb.sql("SELECT 1 as x") extend { measure: c is count() }
|
|
26
|
-
|
|
27
|
-
source: open_src is duckdb.sql("SELECT 1 as x") extend { measure: c is count() }
|
|
28
|
-
`;
|
|
29
|
-
|
|
30
|
-
describe("compile-path authorize gate (compileSource)", () => {
|
|
31
|
-
let rootDir: string;
|
|
32
|
-
let env: Environment;
|
|
33
|
-
|
|
34
|
-
beforeEach(async () => {
|
|
35
|
-
rootDir = await fs.mkdtemp(path.join(os.tmpdir(), "publisher-compile-"));
|
|
36
|
-
const envPath = path.join(rootDir, "env");
|
|
37
|
-
await fs.mkdir(envPath, { recursive: true });
|
|
38
|
-
env = await Environment.create("testEnv", envPath, []);
|
|
39
|
-
await env.installPackage("pkg", async (stagingPath) => {
|
|
40
|
-
await fs.mkdir(stagingPath, { recursive: true });
|
|
41
|
-
await fs.writeFile(
|
|
42
|
-
path.join(stagingPath, "publisher.json"),
|
|
43
|
-
PUBLISHER_JSON,
|
|
44
|
-
);
|
|
45
|
-
await fs.writeFile(path.join(stagingPath, "model.malloy"), MODEL);
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
afterEach(async () => {
|
|
50
|
-
await fs.rm(rootDir, { recursive: true, force: true }).catch(() => {});
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
const compile = (source: string, givens?: Record<string, string>) =>
|
|
54
|
-
env.compileSource("pkg", "model.malloy", source, false, givens);
|
|
55
|
-
|
|
56
|
-
it("denies a direct gated source without the satisfying given (early gate)", async () => {
|
|
57
|
-
await expect(
|
|
58
|
-
compile("run: gated -> { aggregate: c }"),
|
|
59
|
-
).rejects.toBeInstanceOf(AccessDeniedError);
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it("denies a gated source reached via the LAST run: statement (backstop, includeSql=false)", async () => {
|
|
63
|
-
// Regression guard: the early gate only matches the first `run:` (ungated
|
|
64
|
-
// open_src here), so the gated source in the executed final statement is
|
|
65
|
-
// caught only by the compiled-source backstop — which must run even when
|
|
66
|
-
// no SQL is requested.
|
|
67
|
-
await expect(
|
|
68
|
-
compile(
|
|
69
|
-
"run: open_src -> { aggregate: c }\nrun: gated -> { aggregate: c }",
|
|
70
|
-
),
|
|
71
|
-
).rejects.toBeInstanceOf(AccessDeniedError);
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it("allows the gated source when the given satisfies the gate", async () => {
|
|
75
|
-
const { problems } = await compile("run: gated -> { aggregate: c }", {
|
|
76
|
-
ROLE: "analyst",
|
|
77
|
-
});
|
|
78
|
-
expect(problems).toBeDefined();
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it("leaves an ungated source compilable without any given", async () => {
|
|
82
|
-
const { problems } = await compile("run: open_src -> { aggregate: c }");
|
|
83
|
-
expect(problems).toBeDefined();
|
|
84
|
-
});
|
|
85
|
-
});
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it } from "bun:test";
|
|
2
|
-
import fs from "fs/promises";
|
|
3
|
-
import os from "os";
|
|
4
|
-
import path from "path";
|
|
5
|
-
import { Environment } from "./environment";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* The fragment-checking advice in malloy_compile's tool description, pinned
|
|
9
|
-
* against the REAL compiler.
|
|
10
|
-
*
|
|
11
|
-
* That description tells an agent how to validate part of a source: send a view
|
|
12
|
-
* body as a top-level `query:`, or wrap a field in a throwaway `extend`, and do
|
|
13
|
-
* not resubmit the source being edited. None of that is enforced by code, so
|
|
14
|
-
* nothing but a test stops it from quietly becoming false. Asserting it against
|
|
15
|
-
* a hand-written checker would be worthless: only Malloy decides what compiles.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
const PUBLISHER_JSON = JSON.stringify({
|
|
19
|
-
name: "pkg",
|
|
20
|
-
description: "fragments",
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
// `secret` is private on the base source, so nothing downstream may read it.
|
|
24
|
-
const MODEL = `##! experimental.access_modifiers
|
|
25
|
-
source: base is duckdb.sql("SELECT 1.5 as price, 90 as points, 'shh' as secret") include {
|
|
26
|
-
public: price, points
|
|
27
|
-
private: secret
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
source: sales is base extend {
|
|
31
|
-
measure: record_count is count()
|
|
32
|
-
measure: avg_price is avg(price)
|
|
33
|
-
view: overview is { aggregate: record_count }
|
|
34
|
-
}
|
|
35
|
-
`;
|
|
36
|
-
|
|
37
|
-
describe("malloy_compile: checking part of a source", () => {
|
|
38
|
-
let rootDir: string;
|
|
39
|
-
let env: Environment;
|
|
40
|
-
|
|
41
|
-
beforeEach(async () => {
|
|
42
|
-
rootDir = await fs.mkdtemp(path.join(os.tmpdir(), "publisher-frag-"));
|
|
43
|
-
const envPath = path.join(rootDir, "env");
|
|
44
|
-
await fs.mkdir(envPath, { recursive: true });
|
|
45
|
-
env = await Environment.create("testEnv", envPath, []);
|
|
46
|
-
await env.installPackage("pkg", async (stagingPath) => {
|
|
47
|
-
await fs.mkdir(stagingPath, { recursive: true });
|
|
48
|
-
await fs.writeFile(
|
|
49
|
-
path.join(stagingPath, "publisher.json"),
|
|
50
|
-
PUBLISHER_JSON,
|
|
51
|
-
);
|
|
52
|
-
await fs.writeFile(path.join(stagingPath, "model.malloy"), MODEL);
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
afterEach(async () => {
|
|
57
|
-
await fs.rm(rootDir, { recursive: true, force: true }).catch(() => {});
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
/** Error-severity messages from compiling `source` against the fixture. */
|
|
61
|
-
async function errorsFor(source: string): Promise<string[]> {
|
|
62
|
-
const result = await env.compileSource("pkg", "model.malloy", source);
|
|
63
|
-
return (result.problems ?? [])
|
|
64
|
-
.filter((p) => p.severity === "error")
|
|
65
|
-
.map((p) => p.message);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
describe("the two failures the description exists to explain", () => {
|
|
69
|
-
it("rejects a bare view: fragment, naming only the symptom", async () => {
|
|
70
|
-
const errors = await errorsFor(
|
|
71
|
-
"view: by_pts is { group_by: points, aggregate: record_count }",
|
|
72
|
-
);
|
|
73
|
-
expect(errors.join(" ")).toContain("view:");
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
it("rejects resubmitting the source being edited", async () => {
|
|
77
|
-
// The natural move when validating an edit, and it fails for a reason
|
|
78
|
-
// that has nothing to do with the edit.
|
|
79
|
-
const errors = await errorsFor(`source: sales is base extend {
|
|
80
|
-
measure: record_count is count()
|
|
81
|
-
view: by_pts is { group_by: points }
|
|
82
|
-
}`);
|
|
83
|
-
expect(errors.join(" ")).toContain("Cannot redefine 'sales'");
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
describe("the top-level query: form", () => {
|
|
88
|
-
it("compiles a view body with no wrapper at all", async () => {
|
|
89
|
-
expect(
|
|
90
|
-
await errorsFor(
|
|
91
|
-
"query: check is sales -> { group_by: points, aggregate: record_count }",
|
|
92
|
-
),
|
|
93
|
-
).toEqual([]);
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
it("still resolves measures the source inherits", async () => {
|
|
97
|
-
expect(
|
|
98
|
-
await errorsFor(
|
|
99
|
-
"query: check is sales -> { aggregate: avg_price }",
|
|
100
|
-
),
|
|
101
|
-
).toEqual([]);
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
describe("the throwaway extend form", () => {
|
|
106
|
-
const wrap = (fragment: string, into = "sales") =>
|
|
107
|
-
`source: check is ${into} extend {\n${fragment}\n}`;
|
|
108
|
-
|
|
109
|
-
it("compiles bare view, measure, and dimension fragments", async () => {
|
|
110
|
-
expect(
|
|
111
|
-
await errorsFor(
|
|
112
|
-
wrap(
|
|
113
|
-
"view: by_pts is { group_by: points, aggregate: record_count }",
|
|
114
|
-
),
|
|
115
|
-
),
|
|
116
|
-
).toEqual([]);
|
|
117
|
-
expect(
|
|
118
|
-
await errorsFor(wrap("measure: max_price is max(price)")),
|
|
119
|
-
).toEqual([]);
|
|
120
|
-
expect(
|
|
121
|
-
await errorsFor(wrap("dimension: pricey is price > 1")),
|
|
122
|
-
).toEqual([]);
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
it("resolves measures the source inherits", async () => {
|
|
126
|
-
expect(
|
|
127
|
-
await errorsFor(wrap("view: v is { aggregate: avg_price }")),
|
|
128
|
-
).toEqual([]);
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
it("hides a private field exactly as an in-place extension does", async () => {
|
|
132
|
-
// The fidelity claim in the description: the wrapper must not widen or
|
|
133
|
-
// narrow visibility versus the edit it stands in for.
|
|
134
|
-
const wrapped = await errorsFor(wrap("dimension: s is secret"));
|
|
135
|
-
const inPlace = await errorsFor(
|
|
136
|
-
"source: probe is base extend { dimension: s is secret }",
|
|
137
|
-
);
|
|
138
|
-
expect(wrapped.join(" ")).toContain("private");
|
|
139
|
-
expect(inPlace.join(" ")).toContain("private");
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
it("reports a redefinition when the fragment reuses an existing name", async () => {
|
|
143
|
-
// The documented caveat: an extension adds to the namespace rather
|
|
144
|
-
// than overriding it, so checking an EDIT needs the fragment renamed.
|
|
145
|
-
expect(
|
|
146
|
-
await errorsFor(wrap("view: overview is { aggregate: avg_price }")),
|
|
147
|
-
).toEqual(["Cannot redefine 'overview'"]);
|
|
148
|
-
|
|
149
|
-
expect(
|
|
150
|
-
await errorsFor(
|
|
151
|
-
wrap("view: overview__check is { aggregate: avg_price }"),
|
|
152
|
-
),
|
|
153
|
-
).toEqual([]);
|
|
154
|
-
});
|
|
155
|
-
});
|
|
156
|
-
});
|