@sixb/core 0.1.19 → 0.1.21
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/actions/execution.d.ts.map +1 -1
- package/dist/actions/index.js +54 -47
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/request.d.ts.map +1 -1
- package/dist/actions/run-authorization.d.ts +9 -0
- package/dist/actions/run-authorization.d.ts.map +1 -1
- package/dist/activity/connection.d.ts +62 -0
- package/dist/activity/connection.d.ts.map +1 -0
- package/dist/activity/device.d.ts +8 -0
- package/dist/activity/device.d.ts.map +1 -0
- package/dist/activity/execution.d.ts +48 -0
- package/dist/activity/execution.d.ts.map +1 -0
- package/dist/activity/service.d.ts +79 -0
- package/dist/activity/service.d.ts.map +1 -0
- package/dist/activity/shares.d.ts +24 -0
- package/dist/activity/shares.d.ts.map +1 -0
- package/dist/activity/timeline.d.ts +96 -0
- package/dist/activity/timeline.d.ts.map +1 -0
- package/dist/agents/index.d.ts +2 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +63 -50
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/request.d.ts.map +1 -1
- package/dist/agents/skills.d.ts.map +1 -1
- package/dist/agents/streams/index.js +3 -3
- package/dist/agents/streams/internal.js +3 -3
- package/dist/agents/types.d.ts +8 -8
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/validation.d.ts +1 -1
- package/dist/agents/validation.d.ts.map +1 -1
- package/dist/artifacts/address.d.ts +48 -0
- package/dist/artifacts/address.d.ts.map +1 -0
- package/dist/artifacts/csv.d.ts +22 -0
- package/dist/artifacts/csv.d.ts.map +1 -0
- package/dist/artifacts/errors.d.ts +11 -0
- package/dist/artifacts/errors.d.ts.map +1 -0
- package/dist/artifacts/execution.d.ts +43 -0
- package/dist/artifacts/execution.d.ts.map +1 -0
- package/dist/artifacts/frames/assets.d.ts +28 -0
- package/dist/artifacts/frames/assets.d.ts.map +1 -0
- package/dist/artifacts/frames/grants.d.ts +37 -0
- package/dist/artifacts/frames/grants.d.ts.map +1 -0
- package/dist/artifacts/frames/index.d.ts +10 -0
- package/dist/artifacts/frames/index.d.ts.map +1 -0
- package/dist/artifacts/frames/index.js +892 -0
- package/dist/artifacts/frames/index.js.map +14 -0
- package/dist/artifacts/frames/kit.d.ts +66 -0
- package/dist/artifacts/frames/kit.d.ts.map +1 -0
- package/dist/artifacts/frames/probe.d.ts +41 -0
- package/dist/artifacts/frames/probe.d.ts.map +1 -0
- package/dist/artifacts/frames/protocol.d.ts +98 -0
- package/dist/artifacts/frames/protocol.d.ts.map +1 -0
- package/dist/artifacts/frames/runtime.d.ts +13 -0
- package/dist/artifacts/frames/runtime.d.ts.map +1 -0
- package/dist/artifacts/html.d.ts +6 -0
- package/dist/artifacts/html.d.ts.map +1 -0
- package/dist/artifacts/ids.d.ts +5 -0
- package/dist/artifacts/ids.d.ts.map +1 -0
- package/dist/artifacts/index.d.ts +16 -0
- package/dist/artifacts/index.d.ts.map +1 -0
- package/dist/artifacts/index.js +125 -0
- package/dist/artifacts/index.js.map +10 -0
- package/dist/artifacts/kinds.d.ts +5 -0
- package/dist/artifacts/kinds.d.ts.map +1 -0
- package/dist/artifacts/limits.d.ts +28 -0
- package/dist/artifacts/limits.d.ts.map +1 -0
- package/dist/artifacts/outline.d.ts +44 -0
- package/dist/artifacts/outline.d.ts.map +1 -0
- package/dist/artifacts/publish/files.d.ts +15 -0
- package/dist/artifacts/publish/files.d.ts.map +1 -0
- package/dist/artifacts/publish/index.d.ts +5 -0
- package/dist/artifacts/publish/index.d.ts.map +1 -0
- package/dist/artifacts/publish/index.js +36 -0
- package/dist/artifacts/publish/index.js.map +9 -0
- package/dist/artifacts/publish/publish.d.ts +52 -0
- package/dist/artifacts/publish/publish.d.ts.map +1 -0
- package/dist/artifacts/publish/references.d.ts +27 -0
- package/dist/artifacts/publish/references.d.ts.map +1 -0
- package/dist/artifacts/publish/validate/document.d.ts +17 -0
- package/dist/artifacts/publish/validate/document.d.ts.map +1 -0
- package/dist/artifacts/publish/validate/file.d.ts +8 -0
- package/dist/artifacts/publish/validate/file.d.ts.map +1 -0
- package/dist/artifacts/publish/validate/sheet.d.ts +15 -0
- package/dist/artifacts/publish/validate/sheet.d.ts.map +1 -0
- package/dist/artifacts/publish/validate/slides.d.ts +21 -0
- package/dist/artifacts/publish/validate/slides.d.ts.map +1 -0
- package/dist/artifacts/references.d.ts +12 -0
- package/dist/artifacts/references.d.ts.map +1 -0
- package/dist/artifacts/resolve.d.ts +41 -0
- package/dist/artifacts/resolve.d.ts.map +1 -0
- package/dist/artifacts/theme.d.ts +19 -0
- package/dist/artifacts/theme.d.ts.map +1 -0
- package/dist/artifacts/warnings.d.ts +11 -0
- package/dist/artifacts/warnings.d.ts.map +1 -0
- package/dist/artifacts/workbook.d.ts +64 -0
- package/dist/artifacts/workbook.d.ts.map +1 -0
- package/dist/auth/cookies.d.ts +2 -4
- package/dist/auth/cookies.d.ts.map +1 -1
- package/dist/auth/index.d.ts +0 -2
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +14 -20
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/runtime.d.ts +8 -10
- package/dist/auth/runtime.d.ts.map +1 -1
- package/dist/auth/session-cache.d.ts +1 -5
- package/dist/auth/session-cache.d.ts.map +1 -1
- package/dist/auth/strategy.js +1 -1
- package/dist/auth/types.d.ts +4 -8
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/validation.d.ts +0 -1
- package/dist/auth/validation.d.ts.map +1 -1
- package/dist/authorization/decision.d.ts +2 -4
- package/dist/authorization/decision.d.ts.map +1 -1
- package/dist/authorization/grant-kinds.d.ts +6 -8
- package/dist/authorization/grant-kinds.d.ts.map +1 -1
- package/dist/authorization/index.d.ts +0 -1
- package/dist/authorization/index.d.ts.map +1 -1
- package/dist/authorization/index.js +7 -11
- package/dist/authorization/index.js.map +1 -1
- package/dist/authorization/resolve.d.ts +1 -1
- package/dist/authorization/resolve.d.ts.map +1 -1
- package/dist/blob-storage/browser.js +1 -1
- package/dist/blob-storage/index.js +2 -2
- package/dist/blob-storage/internal.d.ts +1 -1
- package/dist/blob-storage/internal.d.ts.map +1 -1
- package/dist/blob-storage/internal.js +11 -5
- package/dist/blob-storage/internal.js.map +1 -1
- package/dist/blob-storage/media-type.d.ts +12 -0
- package/dist/blob-storage/media-type.d.ts.map +1 -1
- package/dist/bootstrap/index.js +54 -48
- package/dist/bootstrap/index.js.map +2 -2
- package/dist/{chunk-t6vq7bff.js → chunk-0bphap9y.js} +5 -5
- package/dist/{chunk-7mbzgd9m.js → chunk-1cc1xaf3.js} +3 -3
- package/dist/chunk-3jms7je7.js +14 -0
- package/dist/chunk-3jms7je7.js.map +10 -0
- package/dist/{chunk-s54c868q.js → chunk-3qct2mdc.js} +3 -13
- package/dist/chunk-3qct2mdc.js.map +12 -0
- package/dist/{chunk-6gmfggss.js → chunk-431pyp2c.js} +3 -3
- package/dist/{chunk-c85m1hyj.js → chunk-447a5c0p.js} +2 -2
- package/dist/chunk-48qjhh6v.js +185 -0
- package/dist/chunk-48qjhh6v.js.map +13 -0
- package/dist/{chunk-80mc0971.js → chunk-561r0yc9.js} +8 -8
- package/dist/{chunk-5e43w60z.js → chunk-5948n82c.js} +2 -2
- package/dist/{chunk-yzwja0mj.js → chunk-5hx48dnn.js} +2 -2
- package/dist/{chunk-tjb1mk5t.js → chunk-5vems3nx.js} +5 -6
- package/dist/{chunk-tjb1mk5t.js.map → chunk-5vems3nx.js.map} +3 -3
- package/dist/{chunk-aff7cyea.js → chunk-61y5xs4p.js} +563 -167
- package/dist/{chunk-aff7cyea.js.map → chunk-61y5xs4p.js.map} +12 -9
- package/dist/chunk-65abf64x.js +13 -0
- package/dist/chunk-65abf64x.js.map +10 -0
- package/dist/{chunk-z3y5kg1x.js → chunk-6eqsgvxk.js} +3 -3
- package/dist/{chunk-z3y5kg1x.js.map → chunk-6eqsgvxk.js.map} +2 -2
- package/dist/chunk-6rqgmkde.js +2028 -0
- package/dist/chunk-6rqgmkde.js.map +29 -0
- package/dist/{chunk-y7rqfrgg.js → chunk-6vb4st8k.js} +29 -38
- package/dist/chunk-6vb4st8k.js.map +23 -0
- package/dist/chunk-7q8t23v4.js +467 -0
- package/dist/chunk-7q8t23v4.js.map +14 -0
- package/dist/{chunk-kyzq4wy9.js → chunk-858emn8m.js} +17 -17
- package/dist/chunk-858emn8m.js.map +18 -0
- package/dist/{chunk-hvsb78a1.js → chunk-8frc8a4j.js} +26 -26
- package/dist/{chunk-hvsb78a1.js.map → chunk-8frc8a4j.js.map} +2 -2
- package/dist/{chunk-3zxk45er.js → chunk-8ncg20rd.js} +3 -68
- package/dist/{chunk-3zxk45er.js.map → chunk-8ncg20rd.js.map} +4 -5
- package/dist/{chunk-j2bp5ryw.js → chunk-918wwnaa.js} +495 -28
- package/dist/{chunk-j2bp5ryw.js.map → chunk-918wwnaa.js.map} +14 -12
- package/dist/{chunk-1f7wpmyp.js → chunk-9j4jw7as.js} +103 -110
- package/dist/chunk-9j4jw7as.js.map +14 -0
- package/dist/chunk-9kgkfg6v.js +502 -0
- package/dist/chunk-9kgkfg6v.js.map +14 -0
- package/dist/chunk-a3faa34j.js +74 -0
- package/dist/chunk-a3faa34j.js.map +10 -0
- package/dist/{chunk-ey3pyej1.js → chunk-akzryx9h.js} +347 -1174
- package/dist/{chunk-ey3pyej1.js.map → chunk-akzryx9h.js.map} +19 -25
- package/dist/chunk-arns890k.js +10 -0
- package/dist/chunk-arns890k.js.map +10 -0
- package/dist/{chunk-zrmy8zvw.js → chunk-bk9svbcq.js} +11 -11
- package/dist/{chunk-zrmy8zvw.js.map → chunk-bk9svbcq.js.map} +2 -2
- package/dist/{chunk-hkc3jct7.js → chunk-c06hmxyy.js} +2 -10
- package/dist/chunk-c06hmxyy.js.map +10 -0
- package/dist/{chunk-q1vkr2ys.js → chunk-c1rxbz5y.js} +3 -3
- package/dist/chunk-cfj9dfbb.js +288 -0
- package/dist/chunk-cfj9dfbb.js.map +12 -0
- package/dist/{chunk-4tcx876c.js → chunk-cn0fwwhy.js} +19 -19
- package/dist/{chunk-4tcx876c.js.map → chunk-cn0fwwhy.js.map} +1 -1
- package/dist/{chunk-gc4ntf7d.js → chunk-cwdzcv37.js} +1 -1
- package/dist/{chunk-fa02jy15.js → chunk-cy4mbddw.js} +1 -1
- package/dist/{chunk-7kg3k1m9.js → chunk-d09e3rax.js} +1 -1
- package/dist/chunk-d5rjr8c0.js +176 -0
- package/dist/chunk-d5rjr8c0.js.map +12 -0
- package/dist/{chunk-rhg02hxq.js → chunk-d7dnxdep.js} +3 -3
- package/dist/{chunk-b38szspf.js → chunk-dhcv7yxc.js} +1 -1
- package/dist/{chunk-b38szspf.js.map → chunk-dhcv7yxc.js.map} +1 -1
- package/dist/{chunk-enpsx8k5.js → chunk-dhdha526.js} +23 -21
- package/dist/chunk-dhdha526.js.map +10 -0
- package/dist/{chunk-8mx7qw3y.js → chunk-dvd2fp9q.js} +2 -2
- package/dist/{chunk-8mx7qw3y.js.map → chunk-dvd2fp9q.js.map} +3 -3
- package/dist/{chunk-bwjcehza.js → chunk-e17zdm62.js} +6 -12
- package/dist/{chunk-bwjcehza.js.map → chunk-e17zdm62.js.map} +3 -4
- package/dist/{chunk-tpn40322.js → chunk-e6k4thh5.js} +11 -10
- package/dist/{chunk-tpn40322.js.map → chunk-e6k4thh5.js.map} +3 -3
- package/dist/{chunk-tw03bsmb.js → chunk-eptrvnby.js} +224 -3
- package/dist/chunk-eptrvnby.js.map +12 -0
- package/dist/{chunk-xt1zt7gv.js → chunk-f4pamkt9.js} +30 -23
- package/dist/chunk-f4pamkt9.js.map +12 -0
- package/dist/chunk-ff5xkv0p.js +211 -0
- package/dist/chunk-ff5xkv0p.js.map +10 -0
- package/dist/{chunk-bpgy64fw.js → chunk-g257jwnc.js} +10 -4
- package/dist/{chunk-bpgy64fw.js.map → chunk-g257jwnc.js.map} +3 -3
- package/dist/chunk-g5bvzyyr.js +32 -0
- package/dist/chunk-g5bvzyyr.js.map +10 -0
- package/dist/{chunk-2jntasmh.js → chunk-hcbyfxbe.js} +25 -49
- package/dist/chunk-hcbyfxbe.js.map +12 -0
- package/dist/chunk-hke9aeen.js +9 -0
- package/dist/chunk-hke9aeen.js.map +10 -0
- package/dist/{chunk-1sr8ryzk.js → chunk-hwksyjks.js} +122 -1
- package/dist/{chunk-1sr8ryzk.js.map → chunk-hwksyjks.js.map} +3 -3
- package/dist/chunk-jcfw4h7m.js +9 -0
- package/dist/chunk-jcfw4h7m.js.map +10 -0
- package/dist/{chunk-85yvv5n0.js → chunk-k43ct2ke.js} +20 -11
- package/dist/chunk-k43ct2ke.js.map +12 -0
- package/dist/{chunk-dnmadg9k.js → chunk-kge7k6ey.js} +40 -8
- package/dist/chunk-kge7k6ey.js.map +15 -0
- package/dist/{chunk-wz0xs816.js → chunk-ky3j490c.js} +2 -2
- package/dist/chunk-mjddfa7k.js +129 -0
- package/dist/chunk-mjddfa7k.js.map +12 -0
- package/dist/{chunk-3gnrh4ve.js → chunk-nn5xnx3s.js} +86 -111
- package/dist/chunk-nn5xnx3s.js.map +40 -0
- package/dist/{chunk-rz53yb4v.js → chunk-q5e5tv4b.js} +35 -7
- package/dist/{chunk-rz53yb4v.js.map → chunk-q5e5tv4b.js.map} +3 -3
- package/dist/{chunk-vyf9kfqf.js → chunk-q7gn29y3.js} +1 -1
- package/dist/{chunk-d2ync1v3.js → chunk-rmakanzx.js} +10 -12
- package/dist/{chunk-d2ync1v3.js.map → chunk-rmakanzx.js.map} +3 -4
- package/dist/{chunk-v9xd5wzd.js → chunk-s7jg7pmn.js} +1 -1
- package/dist/chunk-tbc1ngpd.js +642 -0
- package/dist/chunk-tbc1ngpd.js.map +18 -0
- package/dist/chunk-twe4dx8p.js +676 -0
- package/dist/chunk-twe4dx8p.js.map +15 -0
- package/dist/{chunk-nre82s12.js → chunk-vf57cr4t.js} +2 -2
- package/dist/{chunk-9ybhtmg4.js → chunk-vvxtn22d.js} +1 -1
- package/dist/{chunk-jhm3zsa7.js → chunk-wkv3h3q7.js} +64 -2
- package/dist/{chunk-jhm3zsa7.js.map → chunk-wkv3h3q7.js.map} +3 -3
- package/dist/chunk-x0v3jd47.js +124 -0
- package/dist/chunk-x0v3jd47.js.map +10 -0
- package/dist/{chunk-7t429e3f.js → chunk-xvsc5m8n.js} +1 -1
- package/dist/{chunk-kg5j6fct.js → chunk-y5tah2kf.js} +1 -1
- package/dist/{chunk-52bk93x8.js → chunk-z58tm0hm.js} +2 -2
- package/dist/datasets/builders.d.ts +15 -2
- package/dist/datasets/builders.d.ts.map +1 -1
- package/dist/datasets/column-index.d.ts +7 -0
- package/dist/datasets/column-index.d.ts.map +1 -0
- package/dist/datasets/execution.d.ts +3 -2
- package/dist/datasets/execution.d.ts.map +1 -1
- package/dist/datasets/write.js +8 -8
- package/dist/deploy/internal.js +4 -3
- package/dist/deploy/internal.js.map +4 -4
- package/dist/deploy/services.d.ts.map +1 -1
- package/dist/deploy/types.d.ts +1 -2
- package/dist/deploy/types.d.ts.map +1 -1
- package/dist/error-reporting/internal.js +4 -4
- package/dist/errors/internal.d.ts +1 -0
- package/dist/errors/internal.d.ts.map +1 -1
- package/dist/errors/internal.js +7 -4
- package/dist/errors/internal.js.map +1 -1
- package/dist/events/execution.d.ts +12 -2
- package/dist/events/execution.d.ts.map +1 -1
- package/dist/events/index.js +4 -4
- package/dist/execution/agent.js +56 -49
- package/dist/execution/agent.js.map +1 -1
- package/dist/execution/authorization.d.ts.map +1 -1
- package/dist/execution/authorized-object-reader.d.ts +52 -11
- package/dist/execution/authorized-object-reader.d.ts.map +1 -1
- package/dist/execution/object-reader-clearance.d.ts +41 -0
- package/dist/execution/object-reader-clearance.d.ts.map +1 -0
- package/dist/execution/object-reader-ontology.d.ts +12 -0
- package/dist/execution/object-reader-ontology.d.ts.map +1 -0
- package/dist/execution/object-reader-security.d.ts +45 -0
- package/dist/execution/object-reader-security.d.ts.map +1 -0
- package/dist/execution/primitive.js +54 -47
- package/dist/execution/primitive.js.map +1 -1
- package/dist/execution/request.js +49 -42
- package/dist/execution/request.js.map +2 -2
- package/dist/http/api-routes.d.ts.map +1 -1
- package/dist/http/index.js +1 -1
- package/dist/index.d.ts +23 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +111 -109
- package/dist/index.js.map +1 -1
- package/dist/lake-storage/in-memory.d.ts +1 -0
- package/dist/lake-storage/in-memory.d.ts.map +1 -1
- package/dist/lake-storage/index.d.ts +6 -3
- package/dist/lake-storage/index.d.ts.map +1 -1
- package/dist/lake-storage/index.js +21 -13
- package/dist/lake-storage/index.js.map +1 -1
- package/dist/lake-storage/lineage.d.ts +94 -0
- package/dist/lake-storage/lineage.d.ts.map +1 -0
- package/dist/lake-storage/sql-transforms.d.ts +45 -0
- package/dist/lake-storage/sql-transforms.d.ts.map +1 -1
- package/dist/lake-storage/types.d.ts +55 -1
- package/dist/lake-storage/types.d.ts.map +1 -1
- package/dist/lake-storage/version-inputs.d.ts +14 -3
- package/dist/lake-storage/version-inputs.d.ts.map +1 -1
- package/dist/maintenance/ontology-maintenance.d.ts.map +1 -1
- package/dist/materializer/index.js +31 -30
- package/dist/materializer/index.js.map +1 -1
- package/dist/models/execution/index.js +26 -25
- package/dist/models/execution/index.js.map +1 -1
- package/dist/objects/clearance-redaction.d.ts +27 -0
- package/dist/objects/clearance-redaction.d.ts.map +1 -0
- package/dist/objects/index.js +54 -47
- package/dist/objects/index.js.map +1 -1
- package/dist/objects/link/authorization.d.ts +8 -5
- package/dist/objects/link/authorization.d.ts.map +1 -1
- package/dist/objects/link/upsert-batch.d.ts.map +1 -1
- package/dist/objects/object/delete.d.ts.map +1 -1
- package/dist/objects/object/upsert-batch.d.ts.map +1 -1
- package/dist/objects/object/upsert.d.ts.map +1 -1
- package/dist/objects/property-clearance.d.ts +47 -24
- package/dist/objects/property-clearance.d.ts.map +1 -1
- package/dist/objects/query/clearance-admission.d.ts +10 -0
- package/dist/objects/query/clearance-admission.d.ts.map +1 -0
- package/dist/objects/query/index.js +29 -28
- package/dist/objects/query/index.js.map +1 -1
- package/dist/objects/query/link-query-clearance.d.ts +21 -0
- package/dist/objects/query/link-query-clearance.d.ts.map +1 -0
- package/dist/objects/vectors/handle.d.ts.map +1 -1
- package/dist/objects/vectors/profile.d.ts +5 -0
- package/dist/objects/vectors/profile.d.ts.map +1 -1
- package/dist/ontology/builders.d.ts.map +1 -1
- package/dist/ontology/docs-markdown.d.ts +1 -1
- package/dist/ontology/docs-markdown.d.ts.map +1 -1
- package/dist/ontology/index.js +7 -7
- package/dist/ontology/internal.js +4 -4
- package/dist/ontology/internal.js.map +1 -1
- package/dist/pipelines/index.d.ts +2 -0
- package/dist/pipelines/index.d.ts.map +1 -1
- package/dist/pipelines/index.js +47 -35
- package/dist/pipelines/index.js.map +1 -1
- package/dist/pipelines/lineage.d.ts +17 -0
- package/dist/pipelines/lineage.d.ts.map +1 -0
- package/dist/projections/internal.d.ts +2 -2
- package/dist/projections/internal.js +30 -29
- package/dist/projections/internal.js.map +1 -1
- package/dist/runtime/create.d.ts +3 -0
- package/dist/runtime/create.d.ts.map +1 -1
- package/dist/runtime/host.d.ts +6 -0
- package/dist/runtime/host.d.ts.map +1 -1
- package/dist/runtime/internal.d.ts +2 -0
- package/dist/runtime/internal.d.ts.map +1 -1
- package/dist/runtime/internal.js +46 -42
- package/dist/runtime/internal.js.map +1 -1
- package/dist/runtime/ontology-mutations.d.ts +2 -0
- package/dist/runtime/ontology-mutations.d.ts.map +1 -1
- package/dist/runtime/resolve-definitions.d.ts.map +1 -1
- package/dist/runtime/sixb.d.ts +8 -0
- package/dist/runtime/sixb.d.ts.map +1 -1
- package/dist/sandboxes/auth.d.ts +16 -0
- package/dist/sandboxes/auth.d.ts.map +1 -1
- package/dist/sandboxes/config.d.ts.map +1 -1
- package/dist/sandboxes/configuration.d.ts +26 -0
- package/dist/sandboxes/configuration.d.ts.map +1 -1
- package/dist/sandboxes/index.d.ts +1 -1
- package/dist/sandboxes/index.d.ts.map +1 -1
- package/dist/sandboxes/index.js +14 -13
- package/dist/sandboxes/index.js.map +1 -1
- package/dist/sandboxes/sandbox.d.ts +28 -5
- package/dist/sandboxes/sandbox.d.ts.map +1 -1
- package/dist/security/applied-markings-contribution.d.ts +58 -0
- package/dist/security/applied-markings-contribution.d.ts.map +1 -0
- package/dist/security/applied-markings-host.d.ts +10 -0
- package/dist/security/applied-markings-host.d.ts.map +1 -0
- package/dist/security/applied-markings-snapshot.d.ts +67 -0
- package/dist/security/applied-markings-snapshot.d.ts.map +1 -0
- package/dist/security/applied-markings.d.ts +73 -0
- package/dist/security/applied-markings.d.ts.map +1 -0
- package/dist/security/builders.d.ts.map +1 -1
- package/dist/security/dataset-version-markings.d.ts +47 -0
- package/dist/security/dataset-version-markings.d.ts.map +1 -0
- package/dist/security/every.d.ts +1 -4
- package/dist/security/every.d.ts.map +1 -1
- package/dist/security/grants.d.ts +4 -5
- package/dist/security/grants.d.ts.map +1 -1
- package/dist/security/index.d.ts +2 -2
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/internal.d.ts +15 -0
- package/dist/security/internal.d.ts.map +1 -0
- package/dist/security/internal.js +135 -0
- package/dist/security/internal.js.map +10 -0
- package/dist/security/marking-propagation.d.ts +62 -0
- package/dist/security/marking-propagation.d.ts.map +1 -0
- package/dist/security/marking-sets.d.ts +14 -0
- package/dist/security/marking-sets.d.ts.map +1 -0
- package/dist/security/markings.d.ts +6 -3
- package/dist/security/markings.d.ts.map +1 -1
- package/dist/security/membership-policies.d.ts.map +1 -1
- package/dist/security/pipeline-markings.d.ts +20 -0
- package/dist/security/pipeline-markings.d.ts.map +1 -0
- package/dist/security/project.d.ts +4 -0
- package/dist/security/project.d.ts.map +1 -0
- package/dist/security/projection-markings.d.ts +71 -0
- package/dist/security/projection-markings.d.ts.map +1 -0
- package/dist/security/public.d.ts +10 -0
- package/dist/security/public.d.ts.map +1 -0
- package/dist/security/public.js +10 -0
- package/dist/security/public.js.map +9 -0
- package/dist/security/redactions.d.ts +4 -1
- package/dist/security/redactions.d.ts.map +1 -1
- package/dist/security/registry.d.ts +0 -1
- package/dist/security/registry.d.ts.map +1 -1
- package/dist/security/types.d.ts +34 -19
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/validation.d.ts +0 -6
- package/dist/security/validation.d.ts.map +1 -1
- package/dist/shares/internal.js +25 -24
- package/dist/shares/internal.js.map +2 -2
- package/dist/storage/action-runs/failure.js +3 -3
- package/dist/storage/action-runs/in-memory.d.ts +4 -0
- package/dist/storage/action-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/action-runs/types.d.ts +8 -0
- package/dist/storage/action-runs/types.d.ts.map +1 -1
- package/dist/storage/activity/in-memory.d.ts +55 -0
- package/dist/storage/activity/in-memory.d.ts.map +1 -0
- package/dist/storage/activity/index.d.ts +3 -0
- package/dist/storage/activity/index.d.ts.map +1 -0
- package/dist/storage/activity/policy.d.ts +96 -0
- package/dist/storage/activity/policy.d.ts.map +1 -0
- package/dist/storage/activity/types.d.ts +191 -0
- package/dist/storage/activity/types.d.ts.map +1 -0
- package/dist/storage/agents/in-memory.d.ts +4 -0
- package/dist/storage/agents/in-memory.d.ts.map +1 -1
- package/dist/storage/agents/provider.d.ts.map +1 -1
- package/dist/storage/agents/provider.js +2 -5
- package/dist/storage/agents/provider.js.map +1 -1
- package/dist/storage/agents/types.d.ts +10 -9
- package/dist/storage/agents/types.d.ts.map +1 -1
- package/dist/storage/ai-limits/enforcement.js +3 -3
- package/dist/storage/artifacts/errors.d.ts +8 -0
- package/dist/storage/artifacts/errors.d.ts.map +1 -0
- package/dist/storage/artifacts/in-memory.d.ts +34 -0
- package/dist/storage/artifacts/in-memory.d.ts.map +1 -0
- package/dist/storage/artifacts/index.d.ts +5 -0
- package/dist/storage/artifacts/index.d.ts.map +1 -0
- package/dist/storage/artifacts/record.d.ts +17 -0
- package/dist/storage/artifacts/record.d.ts.map +1 -0
- package/dist/storage/artifacts/types.d.ts +184 -0
- package/dist/storage/artifacts/types.d.ts.map +1 -0
- package/dist/storage/auth/in-memory/auth-storage.d.ts.map +1 -1
- package/dist/storage/auth/in-memory/magic-links.d.ts.map +1 -1
- package/dist/storage/auth/in-memory/oidc-attempts.d.ts.map +1 -1
- package/dist/storage/auth/in-memory/sessions.d.ts +2 -11
- package/dist/storage/auth/in-memory/sessions.d.ts.map +1 -1
- package/dist/storage/auth/in-memory/shared.d.ts +1 -2
- package/dist/storage/auth/in-memory/shared.d.ts.map +1 -1
- package/dist/storage/auth/index.d.ts +1 -1
- package/dist/storage/auth/index.d.ts.map +1 -1
- package/dist/storage/auth/types.d.ts +20 -17
- package/dist/storage/auth/types.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider.js +2 -2
- package/dist/storage/executions/in-memory.d.ts +2 -1
- package/dist/storage/executions/in-memory.d.ts.map +1 -1
- package/dist/storage/executions/index.d.ts +1 -1
- package/dist/storage/executions/index.d.ts.map +1 -1
- package/dist/storage/executions/provider.d.ts +2 -0
- package/dist/storage/executions/provider.d.ts.map +1 -1
- package/dist/storage/executions/provider.js +9 -223
- package/dist/storage/executions/provider.js.map +3 -4
- package/dist/storage/executions/types.d.ts +31 -0
- package/dist/storage/executions/types.d.ts.map +1 -1
- package/dist/storage/file-upload-sessions/provider.js +12 -12
- package/dist/storage/in-memory/index.d.ts +8 -0
- package/dist/storage/in-memory/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +6 -4
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +47 -46
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/internal.d.ts +3 -0
- package/dist/storage/internal.d.ts.map +1 -1
- package/dist/storage/internal.js +66 -16
- package/dist/storage/internal.js.map +1 -1
- package/dist/storage/ontology/in-memory/sources.d.ts +2 -1
- package/dist/storage/ontology/in-memory/sources.d.ts.map +1 -1
- package/dist/storage/ontology/index.d.ts +1 -1
- package/dist/storage/ontology/index.d.ts.map +1 -1
- package/dist/storage/ontology/sources.d.ts +15 -0
- package/dist/storage/ontology/sources.d.ts.map +1 -1
- package/dist/storage/projection-runs/provider.js +3 -3
- package/dist/storage/share-grants/in-memory.d.ts +2 -1
- package/dist/storage/share-grants/in-memory.d.ts.map +1 -1
- package/dist/storage/share-grants/index.d.ts +1 -1
- package/dist/storage/share-grants/index.d.ts.map +1 -1
- package/dist/storage/share-grants/types.d.ts +6 -0
- package/dist/storage/share-grants/types.d.ts.map +1 -1
- package/dist/storage/types.d.ts +4 -0
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/workflow-runs/in-memory.d.ts +4 -0
- package/dist/storage/workflow-runs/in-memory.d.ts.map +1 -1
- package/dist/storage/workflow-runs/provider.js +14 -13
- package/dist/storage/workflow-runs/provider.js.map +1 -1
- package/dist/storage/workflow-runs/types.d.ts +5 -0
- package/dist/storage/workflow-runs/types.d.ts.map +1 -1
- package/dist/syncs/index.js +35 -34
- package/dist/syncs/index.js.map +1 -1
- package/dist/testing/action-run-storage-contract.d.ts.map +1 -1
- package/dist/testing/activity-storage-contract.d.ts +14 -0
- package/dist/testing/activity-storage-contract.d.ts.map +1 -0
- package/dist/testing/agent-storage-contract.d.ts.map +1 -1
- package/dist/testing/artifact-storage-contract.d.ts +13 -0
- package/dist/testing/artifact-storage-contract.d.ts.map +1 -0
- package/dist/testing/auth-storage-contract.d.ts.map +1 -1
- package/dist/testing/execution-storage-contract.d.ts.map +1 -1
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +4493 -3225
- package/dist/testing/index.js.map +14 -12
- package/dist/testing/lake-merge-storage-contract.d.ts.map +1 -1
- package/dist/testing/lake-storage-contract.d.ts +2 -0
- package/dist/testing/lake-storage-contract.d.ts.map +1 -1
- package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
- package/dist/testing/share-grant-storage-contract.d.ts.map +1 -1
- package/dist/webhooks/internal.js +28 -27
- package/dist/webhooks/internal.js.map +2 -2
- package/dist/workers/index.js +2 -2
- package/dist/workflows/builders.d.ts.map +1 -1
- package/dist/workflows/index.js +57 -51
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/types.d.ts +9 -0
- package/dist/workflows/types.d.ts.map +1 -1
- package/dist/workflows/validation.d.ts +7 -0
- package/dist/workflows/validation.d.ts.map +1 -1
- package/package.json +32 -2
- package/src/actions/execution.ts +18 -13
- package/src/actions/request.ts +18 -3
- package/src/actions/run-authorization.ts +23 -0
- package/src/activity/README.md +155 -0
- package/src/activity/connection.ts +217 -0
- package/src/activity/device.ts +41 -0
- package/src/activity/execution.ts +210 -0
- package/src/activity/service.ts +274 -0
- package/src/activity/shares.ts +62 -0
- package/src/activity/timeline.ts +424 -0
- package/src/agents/index.ts +8 -3
- package/src/agents/request.ts +5 -0
- package/src/agents/skills.ts +6 -0
- package/src/agents/types.ts +8 -8
- package/src/agents/validation.ts +2 -0
- package/src/artifacts/address.ts +132 -0
- package/src/artifacts/csv.ts +108 -0
- package/src/artifacts/errors.ts +21 -0
- package/src/artifacts/execution.ts +153 -0
- package/src/artifacts/frames/assets.ts +88 -0
- package/src/artifacts/frames/grants.ts +124 -0
- package/src/artifacts/frames/index.ts +15 -0
- package/src/artifacts/frames/kit.ts +392 -0
- package/src/artifacts/frames/probe.ts +309 -0
- package/src/artifacts/frames/protocol.ts +174 -0
- package/src/artifacts/frames/runtime.ts +213 -0
- package/src/artifacts/html.ts +25 -0
- package/src/artifacts/ids.ts +18 -0
- package/src/artifacts/index.ts +61 -0
- package/src/artifacts/kinds.ts +8 -0
- package/src/artifacts/limits.ts +27 -0
- package/src/artifacts/outline.ts +62 -0
- package/src/artifacts/publish/files.ts +87 -0
- package/src/artifacts/publish/index.ts +12 -0
- package/src/artifacts/publish/publish.ts +250 -0
- package/src/artifacts/publish/references.ts +130 -0
- package/src/artifacts/publish/validate/document.ts +114 -0
- package/src/artifacts/publish/validate/file.ts +19 -0
- package/src/artifacts/publish/validate/sheet.ts +251 -0
- package/src/artifacts/publish/validate/slides.ts +134 -0
- package/src/artifacts/references.ts +11 -0
- package/src/artifacts/resolve.ts +97 -0
- package/src/artifacts/theme.ts +116 -0
- package/src/artifacts/warnings.ts +10 -0
- package/src/artifacts/workbook.ts +315 -0
- package/src/auth/cookies.ts +3 -20
- package/src/auth/index.ts +0 -6
- package/src/auth/runtime.ts +59 -76
- package/src/auth/session-cache.ts +2 -9
- package/src/auth/types.ts +4 -8
- package/src/auth/validation.ts +0 -2
- package/src/authorization/decision.ts +13 -23
- package/src/authorization/grant-kinds.ts +33 -28
- package/src/authorization/index.ts +0 -1
- package/src/authorization/resolve.ts +10 -6
- package/src/blob-storage/internal.ts +1 -1
- package/src/blob-storage/media-type.ts +69 -0
- package/src/datasets/builders.ts +66 -2
- package/src/datasets/column-index.ts +19 -0
- package/src/datasets/execution.ts +23 -9
- package/src/deploy/services.ts +0 -1
- package/src/deploy/types.ts +1 -2
- package/src/deploy/validation.ts +3 -1
- package/src/errors/internal.ts +1 -0
- package/src/events/execution.ts +134 -21
- package/src/execution/authorization.ts +11 -5
- package/src/execution/authorized-object-reader.ts +270 -256
- package/src/execution/object-reader-clearance.ts +91 -0
- package/src/execution/object-reader-ontology.ts +63 -0
- package/src/execution/object-reader-security.ts +146 -0
- package/src/http/api-routes.ts +125 -0
- package/src/index.ts +72 -17
- package/src/lake-storage/in-memory.ts +26 -3
- package/src/lake-storage/index.ts +13 -1
- package/src/lake-storage/lineage.ts +385 -0
- package/src/lake-storage/sql-transforms.ts +45 -0
- package/src/lake-storage/types.ts +59 -1
- package/src/lake-storage/version-inputs.ts +35 -6
- package/src/maintenance/ontology-maintenance.ts +15 -0
- package/src/models/execution/embedding.ts +6 -6
- package/src/objects/clearance-redaction.ts +138 -0
- package/src/objects/link/authorization.ts +27 -7
- package/src/objects/link/remove.ts +2 -2
- package/src/objects/link/upsert-batch.ts +7 -5
- package/src/objects/link/upsert.ts +2 -2
- package/src/objects/object/delete.ts +2 -0
- package/src/objects/object/upsert-batch.ts +2 -4
- package/src/objects/object/upsert.ts +2 -3
- package/src/objects/property-clearance.ts +171 -152
- package/src/objects/query/clearance-admission.ts +112 -0
- package/src/objects/query/link-query-clearance.ts +73 -0
- package/src/objects/vectors/README.md +4 -0
- package/src/objects/vectors/handle.ts +11 -2
- package/src/objects/vectors/indexing-generate.ts +2 -2
- package/src/objects/vectors/profile.ts +5 -0
- package/src/ontology/builders.ts +12 -1
- package/src/ontology/docs-markdown.ts +1 -1
- package/src/pipelines/index.ts +2 -0
- package/src/pipelines/lineage.ts +45 -0
- package/src/projections/internal.ts +2 -2
- package/src/runtime/create.ts +4 -0
- package/src/runtime/host.ts +55 -0
- package/src/runtime/internal.ts +2 -0
- package/src/runtime/ontology-mutations.ts +19 -4
- package/src/runtime/resolve-definitions.ts +66 -3
- package/src/runtime/sixb.ts +18 -1
- package/src/sandboxes/README.md +29 -7
- package/src/sandboxes/auth.ts +16 -0
- package/src/sandboxes/config.ts +2 -7
- package/src/sandboxes/configuration.ts +61 -7
- package/src/sandboxes/index.ts +1 -0
- package/src/sandboxes/sandbox.ts +27 -5
- package/src/security/applied-markings-contribution.ts +277 -0
- package/src/security/applied-markings-host.ts +41 -0
- package/src/security/applied-markings-snapshot.ts +235 -0
- package/src/security/applied-markings.ts +405 -0
- package/src/security/builders.ts +7 -2
- package/src/security/dataset-version-markings.ts +163 -0
- package/src/security/every.ts +0 -4
- package/src/security/grants.ts +42 -27
- package/src/security/index.ts +3 -3
- package/src/security/internal.ts +18 -0
- package/src/security/marking-propagation.ts +255 -0
- package/src/security/marking-sets.ts +42 -0
- package/src/security/markings.ts +29 -178
- package/src/security/membership-policies.ts +3 -1
- package/src/security/pipeline-markings.ts +175 -0
- package/src/security/project.ts +8 -0
- package/src/security/projection-markings.ts +421 -0
- package/src/security/public.ts +10 -0
- package/src/security/redactions.ts +7 -2
- package/src/security/registry.ts +0 -8
- package/src/security/types.ts +38 -26
- package/src/security/validation.ts +28 -19
- package/src/storage/action-runs/in-memory.ts +18 -0
- package/src/storage/action-runs/types.ts +8 -0
- package/src/storage/activity/in-memory.ts +374 -0
- package/src/storage/activity/index.ts +27 -0
- package/src/storage/activity/policy.ts +430 -0
- package/src/storage/activity/types.ts +211 -0
- package/src/storage/agents/in-memory.ts +10 -0
- package/src/storage/agents/provider.ts +2 -13
- package/src/storage/agents/types.ts +10 -17
- package/src/storage/artifacts/errors.ts +16 -0
- package/src/storage/artifacts/in-memory.ts +240 -0
- package/src/storage/artifacts/index.ts +30 -0
- package/src/storage/artifacts/record.ts +200 -0
- package/src/storage/artifacts/types.ts +209 -0
- package/src/storage/auth/in-memory/auth-storage.ts +0 -18
- package/src/storage/auth/in-memory/magic-links.ts +0 -3
- package/src/storage/auth/in-memory/oidc-attempts.ts +0 -3
- package/src/storage/auth/in-memory/sessions.ts +22 -25
- package/src/storage/auth/in-memory/shared.ts +1 -10
- package/src/storage/auth/index.ts +2 -0
- package/src/storage/auth/types.ts +20 -18
- package/src/storage/executions/in-memory.ts +61 -1
- package/src/storage/executions/index.ts +3 -0
- package/src/storage/executions/provider.ts +12 -0
- package/src/storage/executions/types.ts +30 -0
- package/src/storage/in-memory/index.ts +16 -0
- package/src/storage/index.ts +63 -0
- package/src/storage/internal.ts +30 -0
- package/src/storage/ontology/in-memory/sources.ts +23 -0
- package/src/storage/ontology/index.ts +2 -0
- package/src/storage/ontology/sources.ts +17 -0
- package/src/storage/share-grants/in-memory.ts +8 -0
- package/src/storage/share-grants/index.ts +1 -0
- package/src/storage/share-grants/types.ts +8 -0
- package/src/storage/types.ts +4 -0
- package/src/storage/workflow-runs/in-memory.ts +16 -0
- package/src/storage/workflow-runs/types.ts +5 -0
- package/src/testing/action-run-storage-contract.ts +25 -0
- package/src/testing/activity-storage-contract.ts +840 -0
- package/src/testing/agent-storage-contract.ts +22 -21
- package/src/testing/artifact-storage-contract.ts +517 -0
- package/src/testing/auth-storage-contract.ts +61 -107
- package/src/testing/execution-storage-contract.ts +147 -3
- package/src/testing/index.ts +9 -0
- package/src/testing/lake-merge-storage-contract.ts +38 -0
- package/src/testing/lake-storage-contract.ts +247 -2
- package/src/testing/materializer-storage-contract.ts +1 -0
- package/src/testing/ontology-storage-contract.ts +57 -2
- package/src/testing/share-grant-storage-contract.ts +15 -0
- package/src/workflows/builders.ts +14 -0
- package/src/workflows/types.ts +9 -0
- package/src/workflows/validation.ts +72 -0
- package/dist/auth/audience.d.ts +0 -8
- package/dist/auth/audience.d.ts.map +0 -1
- package/dist/authorization/application-access.d.ts +0 -18
- package/dist/authorization/application-access.d.ts.map +0 -1
- package/dist/chunk-1f7wpmyp.js.map +0 -14
- package/dist/chunk-1k89ecfr.js +0 -85
- package/dist/chunk-1k89ecfr.js.map +0 -10
- package/dist/chunk-2jntasmh.js.map +0 -13
- package/dist/chunk-3gnrh4ve.js.map +0 -40
- package/dist/chunk-85yvv5n0.js.map +0 -12
- package/dist/chunk-9gyp8hg1.js +0 -363
- package/dist/chunk-9gyp8hg1.js.map +0 -14
- package/dist/chunk-dnmadg9k.js.map +0 -15
- package/dist/chunk-enpsx8k5.js.map +0 -10
- package/dist/chunk-hkc3jct7.js.map +0 -10
- package/dist/chunk-kyzq4wy9.js.map +0 -18
- package/dist/chunk-s16apyk9.js +0 -256
- package/dist/chunk-s16apyk9.js.map +0 -16
- package/dist/chunk-s54c868q.js.map +0 -12
- package/dist/chunk-tw03bsmb.js.map +0 -11
- package/dist/chunk-wwdfe68s.js +0 -128
- package/dist/chunk-wwdfe68s.js.map +0 -11
- package/dist/chunk-xt1zt7gv.js.map +0 -13
- package/dist/chunk-y7rqfrgg.js.map +0 -24
- package/dist/security/applications.d.ts +0 -15
- package/dist/security/applications.d.ts.map +0 -1
- package/src/auth/audience.ts +0 -28
- package/src/authorization/application-access.ts +0 -34
- package/src/security/applications.ts +0 -11
- /package/dist/{chunk-t6vq7bff.js.map → chunk-0bphap9y.js.map} +0 -0
- /package/dist/{chunk-7mbzgd9m.js.map → chunk-1cc1xaf3.js.map} +0 -0
- /package/dist/{chunk-6gmfggss.js.map → chunk-431pyp2c.js.map} +0 -0
- /package/dist/{chunk-c85m1hyj.js.map → chunk-447a5c0p.js.map} +0 -0
- /package/dist/{chunk-80mc0971.js.map → chunk-561r0yc9.js.map} +0 -0
- /package/dist/{chunk-5e43w60z.js.map → chunk-5948n82c.js.map} +0 -0
- /package/dist/{chunk-yzwja0mj.js.map → chunk-5hx48dnn.js.map} +0 -0
- /package/dist/{chunk-q1vkr2ys.js.map → chunk-c1rxbz5y.js.map} +0 -0
- /package/dist/{chunk-gc4ntf7d.js.map → chunk-cwdzcv37.js.map} +0 -0
- /package/dist/{chunk-fa02jy15.js.map → chunk-cy4mbddw.js.map} +0 -0
- /package/dist/{chunk-7kg3k1m9.js.map → chunk-d09e3rax.js.map} +0 -0
- /package/dist/{chunk-rhg02hxq.js.map → chunk-d7dnxdep.js.map} +0 -0
- /package/dist/{chunk-wz0xs816.js.map → chunk-ky3j490c.js.map} +0 -0
- /package/dist/{chunk-vyf9kfqf.js.map → chunk-q7gn29y3.js.map} +0 -0
- /package/dist/{chunk-v9xd5wzd.js.map → chunk-s7jg7pmn.js.map} +0 -0
- /package/dist/{chunk-nre82s12.js.map → chunk-vf57cr4t.js.map} +0 -0
- /package/dist/{chunk-9ybhtmg4.js.map → chunk-vvxtn22d.js.map} +0 -0
- /package/dist/{chunk-7t429e3f.js.map → chunk-xvsc5m8n.js.map} +0 -0
- /package/dist/{chunk-kg5j6fct.js.map → chunk-y5tah2kf.js.map} +0 -0
- /package/dist/{chunk-52bk93x8.js.map → chunk-z58tm0hm.js.map} +0 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { posix } from "node:path"
|
|
2
|
+
import type { ArtifactFile } from "../../../storage/artifacts/types"
|
|
3
|
+
import { isArtifactAddress } from "../../address"
|
|
4
|
+
import { CsvParseError, type CsvTable, parseCsv } from "../../csv"
|
|
5
|
+
import { ARTIFACT_LIMITS } from "../../limits"
|
|
6
|
+
import type { SheetOutline } from "../../outline"
|
|
7
|
+
import {
|
|
8
|
+
NUMERIC_COLUMN_TYPES,
|
|
9
|
+
parseSheetDate,
|
|
10
|
+
parseSheetNumber,
|
|
11
|
+
parseWorkbook,
|
|
12
|
+
type SheetColumnFormat,
|
|
13
|
+
sheetFilePath,
|
|
14
|
+
WORKBOOK_FILE,
|
|
15
|
+
type Workbook,
|
|
16
|
+
type WorkbookSheet,
|
|
17
|
+
} from "../../workbook"
|
|
18
|
+
import { type ArtifactBlobStorage, invalidArtifact, readArtifactText } from "../files"
|
|
19
|
+
import type { FoundReference } from "../references"
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Reads a sheet: `workbook.json`, then each sheet's CSV against it. Every cell of a typed column
|
|
23
|
+
* must read as its type and every chart must name columns its sheet has, so the grid formats and
|
|
24
|
+
* the charts draw the same wherever the sheet is opened.
|
|
25
|
+
*/
|
|
26
|
+
export async function validateSheet(
|
|
27
|
+
blobStorage: ArtifactBlobStorage,
|
|
28
|
+
files: readonly ArtifactFile[]
|
|
29
|
+
): Promise<{
|
|
30
|
+
readonly entry: string
|
|
31
|
+
readonly outline: SheetOutline
|
|
32
|
+
readonly references: readonly FoundReference[]
|
|
33
|
+
}> {
|
|
34
|
+
const byPath = new Map(files.map((file) => [file.path, file]))
|
|
35
|
+
const workbookFile = byPath.get(WORKBOOK_FILE)
|
|
36
|
+
if (!workbookFile) {
|
|
37
|
+
throw invalidArtifact(
|
|
38
|
+
`A sheet is a directory: '${WORKBOOK_FILE}' listing its sheets, and one CSV per sheet under sheets/. A single CSV publishes as a file.`
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
const parsed = parseWorkbook(
|
|
42
|
+
await readArtifactText(blobStorage, workbookFile, ARTIFACT_LIMITS.maxWorkbookBytes)
|
|
43
|
+
)
|
|
44
|
+
if ("error" in parsed) throw invalidArtifact(parsed.error)
|
|
45
|
+
const { workbook } = parsed
|
|
46
|
+
|
|
47
|
+
const declared = new Set(workbook.sheets.map((sheet) => sheetFilePath(sheet.name)))
|
|
48
|
+
const stray = files.find((file) => file.path.startsWith("sheets/") && !declared.has(file.path))
|
|
49
|
+
if (stray) {
|
|
50
|
+
throw invalidArtifact(
|
|
51
|
+
`'${stray.path}' is not a sheet in ${WORKBOOK_FILE}: list it in "sheets", or move it out of sheets/.`
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const tables = new Map<string, CsvTable>()
|
|
56
|
+
const references: FoundReference[] = []
|
|
57
|
+
for (const sheet of workbook.sheets) {
|
|
58
|
+
tables.set(sheet.name, await readSheet(blobStorage, byPath, sheet, references))
|
|
59
|
+
}
|
|
60
|
+
checkCharts(workbook, tables)
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
entry: WORKBOOK_FILE,
|
|
64
|
+
outline: {
|
|
65
|
+
kind: "sheet",
|
|
66
|
+
sheets: workbook.sheets.map((sheet) => {
|
|
67
|
+
const table = tables.get(sheet.name)
|
|
68
|
+
return {
|
|
69
|
+
name: sheet.name,
|
|
70
|
+
rows: table?.rows.length ?? 0,
|
|
71
|
+
columns: [...(table?.header ?? [])],
|
|
72
|
+
}
|
|
73
|
+
}),
|
|
74
|
+
charts: workbook.charts.map((chart) => chart.name),
|
|
75
|
+
},
|
|
76
|
+
references,
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async function readSheet(
|
|
81
|
+
blobStorage: ArtifactBlobStorage,
|
|
82
|
+
byPath: ReadonlyMap<string, ArtifactFile>,
|
|
83
|
+
sheet: WorkbookSheet,
|
|
84
|
+
references: FoundReference[]
|
|
85
|
+
): Promise<CsvTable> {
|
|
86
|
+
const path = sheetFilePath(sheet.name)
|
|
87
|
+
const file = byPath.get(path)
|
|
88
|
+
if (!file) throw invalidArtifact(`Sheet '${sheet.name}' needs its values in '${path}'.`)
|
|
89
|
+
|
|
90
|
+
if (file.file.sizeBytes > ARTIFACT_LIMITS.maxSheetFileBytes) {
|
|
91
|
+
throw invalidArtifact(
|
|
92
|
+
`'${path}' is ${megabytes(file.file.sizeBytes)} MB; a sheet's values may be at most ${megabytes(ARTIFACT_LIMITS.maxSheetFileBytes)} MB, which is what the viewer reads. Split it into several sheets, or publish the CSV as a file.`
|
|
93
|
+
)
|
|
94
|
+
}
|
|
95
|
+
let table: CsvTable
|
|
96
|
+
try {
|
|
97
|
+
table = parseCsv(await readArtifactText(blobStorage, file, ARTIFACT_LIMITS.maxSheetFileBytes))
|
|
98
|
+
} catch (error) {
|
|
99
|
+
if (error instanceof CsvParseError) throw invalidArtifact(`'${path}': ${error.message}`)
|
|
100
|
+
throw error
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const { header, rows } = table
|
|
104
|
+
if (header.length === 0)
|
|
105
|
+
throw invalidArtifact(`'${path}' is empty: its first line names the columns.`)
|
|
106
|
+
if (header.length > ARTIFACT_LIMITS.maxSheetColumns) {
|
|
107
|
+
throw invalidArtifact(
|
|
108
|
+
`'${path}' has ${header.length} columns; a sheet holds at most ${ARTIFACT_LIMITS.maxSheetColumns}.`
|
|
109
|
+
)
|
|
110
|
+
}
|
|
111
|
+
const seen = new Set<string>()
|
|
112
|
+
for (const [index, name] of header.entries()) {
|
|
113
|
+
if (!name.trim()) {
|
|
114
|
+
throw invalidArtifact(`'${path}' column ${index + 1} has no name in the header row.`)
|
|
115
|
+
}
|
|
116
|
+
if (seen.has(name)) throw invalidArtifact(`'${path}' has two columns named '${name}'.`)
|
|
117
|
+
seen.add(name)
|
|
118
|
+
}
|
|
119
|
+
if (rows.length > ARTIFACT_LIMITS.maxSheetRows) {
|
|
120
|
+
throw invalidArtifact(
|
|
121
|
+
`'${path}' has ${rows.length} rows; a sheet holds at most ${ARTIFACT_LIMITS.maxSheetRows}.`
|
|
122
|
+
)
|
|
123
|
+
}
|
|
124
|
+
for (const [index, row] of rows.entries()) {
|
|
125
|
+
if (row.length > header.length) {
|
|
126
|
+
throw invalidArtifact(
|
|
127
|
+
`'${path}' row ${index + 2} has ${row.length} fields; the header names ${header.length} columns.`
|
|
128
|
+
)
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
for (const column of [...Object.keys(sheet.columns), ...Object.keys(sheet.widths)]) {
|
|
133
|
+
if (!seen.has(column)) {
|
|
134
|
+
throw invalidArtifact(
|
|
135
|
+
`${WORKBOOK_FILE} sheet '${sheet.name}' names column '${column}', which '${path}' does not have.`
|
|
136
|
+
)
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
for (const [column, format] of Object.entries(sheet.columns)) {
|
|
140
|
+
const index = header.indexOf(column)
|
|
141
|
+
if (format.type === "link" || format.type === "image") {
|
|
142
|
+
// A link or image may be another artifact's address, resolved with the rest.
|
|
143
|
+
for (const [rowIndex, row] of table.rows.entries()) {
|
|
144
|
+
const value = row[index]?.trim() ?? ""
|
|
145
|
+
if (!isArtifactAddress(value)) continue
|
|
146
|
+
references.push({
|
|
147
|
+
address: value,
|
|
148
|
+
as: format.type === "image" ? "embed" : "link",
|
|
149
|
+
at: `${sheet.name}!${columnLetter(index)}${rowIndex + 2}`,
|
|
150
|
+
})
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
checkColumn(path, table, index, column, format, byPath)
|
|
154
|
+
}
|
|
155
|
+
return table
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function checkColumn(
|
|
159
|
+
path: string,
|
|
160
|
+
table: CsvTable,
|
|
161
|
+
index: number,
|
|
162
|
+
column: string,
|
|
163
|
+
format: SheetColumnFormat,
|
|
164
|
+
byPath: ReadonlyMap<string, ArtifactFile>
|
|
165
|
+
): void {
|
|
166
|
+
for (const [rowIndex, row] of table.rows.entries()) {
|
|
167
|
+
const value = row[index] ?? ""
|
|
168
|
+
if (!value.trim() || isArtifactAddress(value)) continue
|
|
169
|
+
const problem = cellProblem(value, format, byPath)
|
|
170
|
+
if (problem) {
|
|
171
|
+
throw invalidArtifact(
|
|
172
|
+
`'${path}' row ${rowIndex + 2}, column '${column}': ${JSON.stringify(value)} ${problem}`
|
|
173
|
+
)
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function cellProblem(
|
|
179
|
+
value: string,
|
|
180
|
+
format: SheetColumnFormat,
|
|
181
|
+
byPath: ReadonlyMap<string, ArtifactFile>
|
|
182
|
+
): string | undefined {
|
|
183
|
+
switch (format.type) {
|
|
184
|
+
case "number":
|
|
185
|
+
case "currency":
|
|
186
|
+
return parseSheetNumber(value) === undefined
|
|
187
|
+
? "is not a number: write plain digits, such as 4120000 or -3.5, with no symbols or separators."
|
|
188
|
+
: undefined
|
|
189
|
+
case "percent":
|
|
190
|
+
return parseSheetNumber(value) === undefined
|
|
191
|
+
? "is not a number: write a percent as a fraction, such as 0.351 for 35.1%."
|
|
192
|
+
: undefined
|
|
193
|
+
case "date":
|
|
194
|
+
return parseSheetDate(value) === undefined
|
|
195
|
+
? "is not a date: write YYYY-MM-DD, or an ISO 8601 date and time."
|
|
196
|
+
: undefined
|
|
197
|
+
case "link":
|
|
198
|
+
return /^https?:\/\/[^\s]+$/i.test(value.trim())
|
|
199
|
+
? undefined
|
|
200
|
+
: "is not a link: write a full https:// address, or another artifact's address."
|
|
201
|
+
case "image": {
|
|
202
|
+
const imagePath = posix.normalize(value.trim())
|
|
203
|
+
return byPath.has(imagePath)
|
|
204
|
+
? undefined
|
|
205
|
+
: "is not one of the artifact's files: add the image to the artifact and give its relative path, or give another artifact's address."
|
|
206
|
+
}
|
|
207
|
+
case "text":
|
|
208
|
+
return undefined
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function checkCharts(workbook: Workbook, tables: ReadonlyMap<string, CsvTable>): void {
|
|
213
|
+
for (const chart of workbook.charts) {
|
|
214
|
+
const sheet = workbook.sheets.find((candidate) => candidate.name === chart.sheet)
|
|
215
|
+
const table = tables.get(chart.sheet)
|
|
216
|
+
if (!sheet || !table) continue
|
|
217
|
+
for (const column of [chart.x, ...chart.y]) {
|
|
218
|
+
if (!table.header.includes(column)) {
|
|
219
|
+
throw invalidArtifact(
|
|
220
|
+
`${WORKBOOK_FILE} chart '${chart.name}' plots column '${column}', which sheet '${chart.sheet}' does not have.`
|
|
221
|
+
)
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
for (const column of chart.y) {
|
|
225
|
+
const type = sheet.columns[column]?.type ?? "text"
|
|
226
|
+
if (!NUMERIC_COLUMN_TYPES.includes(type)) {
|
|
227
|
+
throw invalidArtifact(
|
|
228
|
+
`${WORKBOOK_FILE} chart '${chart.name}' plots column '${column}', which is ${type}; give it a number, currency, or percent type in "columns".`
|
|
229
|
+
)
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
if (chart.type === "pie" && table.rows.length > ARTIFACT_LIMITS.maxPieSlices) {
|
|
233
|
+
throw invalidArtifact(
|
|
234
|
+
`${WORKBOOK_FILE} chart '${chart.name}' is a pie with ${table.rows.length} slices; a pie reads well with at most ${ARTIFACT_LIMITS.maxPieSlices}. Use a bar chart instead.`
|
|
235
|
+
)
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/** A column's letter as a spreadsheet shows it: A, Z, AA. */
|
|
241
|
+
function columnLetter(index: number): string {
|
|
242
|
+
let letters = ""
|
|
243
|
+
for (let rest = index + 1; rest > 0; rest = Math.floor((rest - 1) / 26)) {
|
|
244
|
+
letters = String.fromCharCode(65 + ((rest - 1) % 26)) + letters
|
|
245
|
+
}
|
|
246
|
+
return letters
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function megabytes(bytes: number): string {
|
|
250
|
+
return (bytes / (1024 * 1024)).toFixed(1).replace(/\.0$/, "")
|
|
251
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import type { ArtifactFile } from "../../../storage/artifacts/types"
|
|
2
|
+
import { isArtifactAddress, parseArtifactAddress } from "../../address"
|
|
3
|
+
import { decodeHtmlEntities } from "../../html"
|
|
4
|
+
import { ARTIFACT_LIMITS } from "../../limits"
|
|
5
|
+
import type { SlidesOutline } from "../../outline"
|
|
6
|
+
import { type ArtifactBlobStorage, invalidArtifact, readArtifactText } from "../files"
|
|
7
|
+
import type { FoundReference } from "../references"
|
|
8
|
+
|
|
9
|
+
/** The file a deck renders from. */
|
|
10
|
+
export const SLIDES_ENTRY = "index.html"
|
|
11
|
+
|
|
12
|
+
/** Where the frame serves the kit and the runtime, beside a deck's own files. */
|
|
13
|
+
export const FRAME_ASSET_PREFIX = "__sixb/"
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Reads a deck: `index.html` with one `<section class="slide">` per 1280×720 slide, and the files
|
|
17
|
+
* it loads beside it. Each slide's first heading becomes its title in the outline. The `artifact:`
|
|
18
|
+
* addresses it uses are returned with the slide each is on, to resolve: links (`<a href>`), files
|
|
19
|
+
* it shows from other artifacts (`<img src>`), and anything else it shows (`<sixb-embed src>`), a
|
|
20
|
+
* chart, a range, a section, or a slide, which the app draws over the frame.
|
|
21
|
+
*/
|
|
22
|
+
export async function validateSlides(
|
|
23
|
+
blobStorage: ArtifactBlobStorage,
|
|
24
|
+
files: readonly ArtifactFile[]
|
|
25
|
+
): Promise<{
|
|
26
|
+
readonly entry: string
|
|
27
|
+
readonly outline: SlidesOutline
|
|
28
|
+
readonly references: readonly FoundReference[]
|
|
29
|
+
}> {
|
|
30
|
+
const entry = files.find((file) => file.path === SLIDES_ENTRY)
|
|
31
|
+
if (!entry) {
|
|
32
|
+
throw invalidArtifact(
|
|
33
|
+
`A deck needs '${SLIDES_ENTRY}' with one <section class="slide"> per slide.`
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
const reserved = files.find((file) => file.path.startsWith(FRAME_ASSET_PREFIX))
|
|
37
|
+
if (reserved) {
|
|
38
|
+
throw invalidArtifact(
|
|
39
|
+
`'${reserved.path}' is under ${FRAME_ASSET_PREFIX}, where Sixb serves the deck's kit and runtime: move it.`
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
const html = await readArtifactText(blobStorage, entry, ARTIFACT_LIMITS.maxDeckBytes)
|
|
43
|
+
|
|
44
|
+
const slides: { title: string; heading: boolean }[] = []
|
|
45
|
+
const references: FoundReference[] = []
|
|
46
|
+
let refused: string | undefined
|
|
47
|
+
const at = () => String(Math.max(1, slides.length))
|
|
48
|
+
// The heading being read, if it is the first of the current slide.
|
|
49
|
+
let reading: { title: string; heading: boolean } | null = null
|
|
50
|
+
new HTMLRewriter()
|
|
51
|
+
.on("section", {
|
|
52
|
+
element(element) {
|
|
53
|
+
const classes = (element.getAttribute("class") ?? "").split(/\s+/)
|
|
54
|
+
if (classes.includes("slide")) slides.push({ title: "", heading: false })
|
|
55
|
+
},
|
|
56
|
+
})
|
|
57
|
+
.on("h1, h2, h3", {
|
|
58
|
+
element(element) {
|
|
59
|
+
const slide = slides.at(-1)
|
|
60
|
+
if (!slide || slide.heading) return
|
|
61
|
+
slide.heading = true
|
|
62
|
+
reading = slide
|
|
63
|
+
element.onEndTag(() => {
|
|
64
|
+
reading = null
|
|
65
|
+
})
|
|
66
|
+
},
|
|
67
|
+
text(chunk) {
|
|
68
|
+
if (reading) reading.title += chunk.text
|
|
69
|
+
},
|
|
70
|
+
})
|
|
71
|
+
.on("a[href]", {
|
|
72
|
+
element(element) {
|
|
73
|
+
const href = decodeHtmlEntities(element.getAttribute("href") ?? "")
|
|
74
|
+
if (isArtifactAddress(href)) {
|
|
75
|
+
references.push({ address: href.trim(), as: "link", at: at() })
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
})
|
|
79
|
+
.on("img[src]", {
|
|
80
|
+
element(element) {
|
|
81
|
+
const source = decodeHtmlEntities(element.getAttribute("src") ?? "").trim()
|
|
82
|
+
if (!isArtifactAddress(source)) return
|
|
83
|
+
if (!parseArtifactAddress(source)?.path) {
|
|
84
|
+
refused ??= `An <img> shows a file from another artifact, and '${source}' names none: show a chart, a range, a section, or a slide with <sixb-embed src="${source}"></sixb-embed>.`
|
|
85
|
+
return
|
|
86
|
+
}
|
|
87
|
+
references.push({ address: source, as: "embed", at: at() })
|
|
88
|
+
},
|
|
89
|
+
})
|
|
90
|
+
.on("sixb-embed", {
|
|
91
|
+
element(element) {
|
|
92
|
+
const source = decodeHtmlEntities(element.getAttribute("src") ?? "").trim()
|
|
93
|
+
if (!isArtifactAddress(source)) {
|
|
94
|
+
refused ??= `<sixb-embed> shows another artifact: give it src="artifact:…", such as artifact:art_k3m9q2x7tp#chart=revenue.`
|
|
95
|
+
return
|
|
96
|
+
}
|
|
97
|
+
references.push({ address: source, as: "embed", at: at() })
|
|
98
|
+
},
|
|
99
|
+
})
|
|
100
|
+
.on("iframe[src], object[data], embed[src]", {
|
|
101
|
+
element(element) {
|
|
102
|
+
const source = decodeHtmlEntities(
|
|
103
|
+
element.getAttribute("src") ?? element.getAttribute("data") ?? ""
|
|
104
|
+
).trim()
|
|
105
|
+
if (isArtifactAddress(source)) {
|
|
106
|
+
refused ??= `${SLIDES_ENTRY} frames '${source}': show another artifact with <sixb-embed src="${source}"></sixb-embed>, or a file of one with <img>.`
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
})
|
|
110
|
+
.transform(html)
|
|
111
|
+
|
|
112
|
+
if (refused) throw invalidArtifact(refused)
|
|
113
|
+
if (slides.length === 0) {
|
|
114
|
+
throw invalidArtifact(
|
|
115
|
+
`${SLIDES_ENTRY} has no slides: put each slide in a <section class="slide">.`
|
|
116
|
+
)
|
|
117
|
+
}
|
|
118
|
+
if (slides.length > ARTIFACT_LIMITS.maxSlides) {
|
|
119
|
+
throw invalidArtifact(
|
|
120
|
+
`A deck holds at most ${ARTIFACT_LIMITS.maxSlides} slides; this one has ${slides.length}.`
|
|
121
|
+
)
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
entry: SLIDES_ENTRY,
|
|
125
|
+
outline: {
|
|
126
|
+
kind: "slides",
|
|
127
|
+
slides: slides.map(({ title }) => {
|
|
128
|
+
const plain = decodeHtmlEntities(title).replace(/\s+/g, " ").trim()
|
|
129
|
+
return plain ? { title: plain } : {}
|
|
130
|
+
}),
|
|
131
|
+
},
|
|
132
|
+
references,
|
|
133
|
+
}
|
|
134
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** An `artifact:` address a version uses, recorded when the version is published. */
|
|
2
|
+
export interface ArtifactReference {
|
|
3
|
+
/** The address as written, such as `artifact:art_k3m9q2x7tp#chart=revenue`. */
|
|
4
|
+
readonly address: string
|
|
5
|
+
/** An embed shows the target in place; a link opens it. */
|
|
6
|
+
readonly as: "embed" | "link"
|
|
7
|
+
/** Where the address sits in its host: a heading slug, a slide number, or a sheet cell. */
|
|
8
|
+
readonly at: string
|
|
9
|
+
/** The target's version when this version was published, so later changes can be told apart. */
|
|
10
|
+
readonly resolvedVersion: number
|
|
11
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { type ArtifactAddress, type CellRange, parseSheetPart } from "./address"
|
|
2
|
+
import type { ArtifactKind } from "./kinds"
|
|
3
|
+
import type { ArtifactOutline } from "./outline"
|
|
4
|
+
|
|
5
|
+
/** The version an address points into: its kind, its outline, and its file list. */
|
|
6
|
+
export interface ArtifactAddressTarget {
|
|
7
|
+
readonly kind: ArtifactKind
|
|
8
|
+
readonly outline: ArtifactOutline
|
|
9
|
+
readonly files: readonly { readonly path: string }[]
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** What an address names inside its target. */
|
|
13
|
+
export type ResolvedArtifactPart =
|
|
14
|
+
| { readonly type: "artifact" }
|
|
15
|
+
| { readonly type: "file"; readonly path: string }
|
|
16
|
+
| { readonly type: "sheet"; readonly sheet: string; readonly range?: CellRange }
|
|
17
|
+
| { readonly type: "chart"; readonly chart: string }
|
|
18
|
+
| { readonly type: "section"; readonly slug: string }
|
|
19
|
+
| { readonly type: "slide"; readonly slide: number }
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Finds what an address names in a version, against its outline and files. A problem says what is
|
|
23
|
+
* missing and what the version has instead, so whoever wrote the address can fix it.
|
|
24
|
+
*/
|
|
25
|
+
export function resolveArtifactAddress(
|
|
26
|
+
address: ArtifactAddress,
|
|
27
|
+
target: ArtifactAddressTarget
|
|
28
|
+
): { readonly part: ResolvedArtifactPart } | { readonly problem: string } {
|
|
29
|
+
if (address.path !== undefined) {
|
|
30
|
+
if (address.part !== undefined) return { problem: "names both a file and a part of one" }
|
|
31
|
+
return target.files.some((file) => file.path === address.path)
|
|
32
|
+
? { part: { type: "file", path: address.path } }
|
|
33
|
+
: { problem: `has no file '${address.path}'` }
|
|
34
|
+
}
|
|
35
|
+
if (address.part === undefined) return { part: { type: "artifact" } }
|
|
36
|
+
|
|
37
|
+
const { outline } = target
|
|
38
|
+
switch (outline.kind) {
|
|
39
|
+
case "sheet": {
|
|
40
|
+
const part = parseSheetPart(address.part)
|
|
41
|
+
if (!part) {
|
|
42
|
+
return {
|
|
43
|
+
problem: `has no part '${address.part}': name a sheet, a range such as Summary!A1:D12, or chart=<name>`,
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (part.type === "chart") {
|
|
47
|
+
return outline.charts.includes(part.chart)
|
|
48
|
+
? { part }
|
|
49
|
+
: { problem: `has no chart '${part.chart}'${listed("its charts", outline.charts)}` }
|
|
50
|
+
}
|
|
51
|
+
const sheet = outline.sheets.find((candidate) => candidate.name === part.sheet)
|
|
52
|
+
if (!sheet) {
|
|
53
|
+
return {
|
|
54
|
+
problem: `has no sheet '${part.sheet}'${listed(
|
|
55
|
+
"its sheets",
|
|
56
|
+
outline.sheets.map((candidate) => candidate.name)
|
|
57
|
+
)}`,
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Row 1 is the header row, so the last row is one past the data rows.
|
|
61
|
+
if (
|
|
62
|
+
part.range &&
|
|
63
|
+
(part.range.bottom > sheet.rows || part.range.right >= sheet.columns.length)
|
|
64
|
+
) {
|
|
65
|
+
return {
|
|
66
|
+
problem: `has no range ${address.part.slice(address.part.lastIndexOf("!") + 1)} in sheet '${sheet.name}', which has ${sheet.rows + 1} rows and ${sheet.columns.length} columns`,
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return { part }
|
|
70
|
+
}
|
|
71
|
+
case "document": {
|
|
72
|
+
const heading = outline.headings.find((candidate) => candidate.slug === address.part)
|
|
73
|
+
return heading
|
|
74
|
+
? { part: { type: "section", slug: heading.slug } }
|
|
75
|
+
: {
|
|
76
|
+
problem: `has no section '${address.part}'${listed(
|
|
77
|
+
"its sections",
|
|
78
|
+
outline.headings.map((candidate) => candidate.slug)
|
|
79
|
+
)}`,
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
case "slides": {
|
|
83
|
+
const slide = /^[1-9]\d*$/.test(address.part) ? Number(address.part) : Number.NaN
|
|
84
|
+
return slide <= outline.slides.length
|
|
85
|
+
? { part: { type: "slide", slide } }
|
|
86
|
+
: { problem: `has no slide '${address.part}': it has ${outline.slides.length} slides` }
|
|
87
|
+
}
|
|
88
|
+
case "file":
|
|
89
|
+
return { problem: `is a ${target.kind}, which has no parts to name` }
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function listed(label: string, names: readonly string[]): string {
|
|
94
|
+
if (names.length === 0) return ""
|
|
95
|
+
const shown = names.slice(0, 8).map((name) => `'${name}'`)
|
|
96
|
+
return `; ${label} are ${shown.join(", ")}${names.length > shown.length ? ", …" : ""}`
|
|
97
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/** An artifact may carry this file at its root to override the app's theme. */
|
|
2
|
+
export const ARTIFACT_THEME_FILE = "theme.json"
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* An artifact's own theme. `mode` pins light or dark whatever the viewer's app uses; `tokens`
|
|
6
|
+
* override the app's values for the names in {@link ARTIFACT_THEME_TOKENS}.
|
|
7
|
+
*/
|
|
8
|
+
export interface ArtifactTheme {
|
|
9
|
+
readonly mode?: "light" | "dark"
|
|
10
|
+
readonly tokens?: Readonly<Record<string, string>>
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const COLOR_TOKENS = [
|
|
14
|
+
"--background",
|
|
15
|
+
"--foreground",
|
|
16
|
+
"--card",
|
|
17
|
+
"--card-foreground",
|
|
18
|
+
"--muted",
|
|
19
|
+
"--muted-foreground",
|
|
20
|
+
"--primary",
|
|
21
|
+
"--primary-foreground",
|
|
22
|
+
"--accent",
|
|
23
|
+
"--accent-foreground",
|
|
24
|
+
"--border",
|
|
25
|
+
"--chart-1",
|
|
26
|
+
"--chart-2",
|
|
27
|
+
"--chart-3",
|
|
28
|
+
"--chart-4",
|
|
29
|
+
"--chart-5",
|
|
30
|
+
] as const
|
|
31
|
+
const FONT_TOKENS = ["--font-sans", "--font-serif", "--font-mono"] as const
|
|
32
|
+
|
|
33
|
+
/** The tokens a theme may set. Every other app token stays the app's. */
|
|
34
|
+
export const ARTIFACT_THEME_TOKENS: readonly string[] = [
|
|
35
|
+
...COLOR_TOKENS,
|
|
36
|
+
...FONT_TOKENS,
|
|
37
|
+
"--radius",
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
// Values land in CSS custom properties, so each kind of token takes one narrow shape: nothing that
|
|
41
|
+
// could close the declaration, open a URL, or call a function other than a color space.
|
|
42
|
+
const HEX_COLOR = /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i
|
|
43
|
+
const FUNCTION_COLOR =
|
|
44
|
+
/^(?:rgba?|hsla?|oklch|oklab|lab|lch)\((?:[\d.%\s,/+-]|deg|turn|rad|none)*\)$/i
|
|
45
|
+
const FONT_FAMILY =
|
|
46
|
+
/^\s*(?:"[\w -]+"|'[\w -]+'|[\w-]+)(?:\s*,\s*(?:"[\w -]+"|'[\w -]+'|[\w-]+))*\s*$/
|
|
47
|
+
const LENGTH = /^(?:0|\d{1,3}(?:\.\d+)?(?:px|rem|em))$/
|
|
48
|
+
|
|
49
|
+
/** Reads a `theme.json`. Returns the reason it was refused, in words the author can act on. */
|
|
50
|
+
export function parseArtifactTheme(
|
|
51
|
+
text: string
|
|
52
|
+
): { readonly theme: ArtifactTheme } | { readonly error: string } {
|
|
53
|
+
let value: unknown
|
|
54
|
+
try {
|
|
55
|
+
value = JSON.parse(text)
|
|
56
|
+
} catch {
|
|
57
|
+
return { error: `${ARTIFACT_THEME_FILE} is not valid JSON.` }
|
|
58
|
+
}
|
|
59
|
+
if (!isObject(value)) return { error: `${ARTIFACT_THEME_FILE} must be a JSON object.` }
|
|
60
|
+
|
|
61
|
+
const unknownKey = Object.keys(value).find((key) => key !== "mode" && key !== "tokens")
|
|
62
|
+
if (unknownKey) {
|
|
63
|
+
return {
|
|
64
|
+
error: `${ARTIFACT_THEME_FILE} has '${unknownKey}'; it takes only "mode" and "tokens".`,
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (value.mode !== undefined && value.mode !== "light" && value.mode !== "dark") {
|
|
68
|
+
return { error: `${ARTIFACT_THEME_FILE} "mode" must be "light" or "dark".` }
|
|
69
|
+
}
|
|
70
|
+
if (value.tokens !== undefined && !isObject(value.tokens)) {
|
|
71
|
+
return { error: `${ARTIFACT_THEME_FILE} "tokens" must be an object of token names to values.` }
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const tokens: Record<string, string> = {}
|
|
75
|
+
for (const [name, tokenValue] of Object.entries(value.tokens ?? {})) {
|
|
76
|
+
if (!ARTIFACT_THEME_TOKENS.includes(name)) {
|
|
77
|
+
return {
|
|
78
|
+
error: `${ARTIFACT_THEME_FILE} sets '${name}'. A theme can set ${ARTIFACT_THEME_TOKENS.join(", ")}.`,
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (typeof tokenValue !== "string" || !tokenValueFits(name, tokenValue)) {
|
|
82
|
+
return {
|
|
83
|
+
error: `${ARTIFACT_THEME_FILE} gives '${name}' a value it cannot use: ${expected(name)}.`,
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
tokens[name] = tokenValue.trim()
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return {
|
|
90
|
+
theme: {
|
|
91
|
+
...(value.mode === undefined ? {} : { mode: value.mode }),
|
|
92
|
+
...(Object.keys(tokens).length === 0 ? {} : { tokens }),
|
|
93
|
+
},
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function tokenValueFits(name: string, value: string): boolean {
|
|
98
|
+
const trimmed = value.trim()
|
|
99
|
+
if (name === "--radius") return LENGTH.test(trimmed)
|
|
100
|
+
if ((FONT_TOKENS as readonly string[]).includes(name)) {
|
|
101
|
+
return trimmed.length <= 200 && FONT_FAMILY.test(trimmed)
|
|
102
|
+
}
|
|
103
|
+
return HEX_COLOR.test(trimmed) || FUNCTION_COLOR.test(trimmed)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function expected(name: string): string {
|
|
107
|
+
if (name === "--radius") return "a length such as 8px or 0.5rem"
|
|
108
|
+
if ((FONT_TOKENS as readonly string[]).includes(name)) {
|
|
109
|
+
return 'a font list such as "Inter Tight", system-ui, sans-serif'
|
|
110
|
+
}
|
|
111
|
+
return "a color such as #2f7280 or oklch(0.62 0.1 210)"
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function isObject(value: unknown): value is Record<string, unknown> {
|
|
115
|
+
return typeof value === "object" && value !== null && !Array.isArray(value)
|
|
116
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Something about a published version worth fixing that did not stop it from publishing. A warning
|
|
3
|
+
* names the part it concerns, so a viewer can point at it.
|
|
4
|
+
*/
|
|
5
|
+
export interface ArtifactWarning {
|
|
6
|
+
readonly code: string
|
|
7
|
+
readonly message: string
|
|
8
|
+
/** The slide, sheet, section, or file the warning is about. */
|
|
9
|
+
readonly part?: string
|
|
10
|
+
}
|