@session-services/web-elements 0.1.17 → 0.1.18
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/README.md +4 -2
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/session-services-elements.cjs.js +1 -1
- package/dist/cjs/session-services-formatted-text.cjs.entry.js +1759 -0
- package/dist/cjs/session-services-ticketing.cjs.entry.js +2071 -834
- package/dist/collection/collection-manifest.json +1 -0
- package/dist/collection/components/session-services-formatted-text/session-services-formatted-text.css +135 -0
- package/dist/collection/components/session-services-formatted-text/session-services-formatted-text.js +162 -0
- package/dist/collection/components/session-services-ticketing/session-services-ticketing.css +175 -3
- package/dist/collection/components/session-services-ticketing/session-services-ticketing.js +50 -9
- package/dist/collection/index.js +1 -11
- package/dist/components/session-services-formatted-text.d.ts +11 -0
- package/dist/components/session-services-formatted-text.js +1786 -0
- package/dist/components/session-services-ticketing.js +2073 -835
- package/dist/esm/loader.js +1 -1
- package/dist/esm/session-services-elements.js +1 -1
- package/dist/esm/session-services-formatted-text.entry.js +1757 -0
- package/dist/esm/session-services-ticketing.entry.js +2071 -834
- package/dist/session-services-elements/p-62a8e2cc.entry.js +1 -0
- package/dist/session-services-elements/p-a2404c46.entry.js +1 -0
- package/dist/session-services-elements/session-services-elements.esm.js +1 -1
- package/dist/types/components/session-services-formatted-text/session-services-formatted-text.d.ts +19 -0
- package/dist/types/components/session-services-ticketing/session-services-ticketing.d.ts +6 -0
- package/dist/types/components.d.ts +29 -0
- package/dist/types/index.d.ts +1 -0
- package/package.json +10 -5
- package/dist/session-services-elements/p-448028d4.entry.js +0 -1
|
@@ -3904,7 +3904,7 @@ function toArray(value) {
|
|
|
3904
3904
|
|
|
3905
3905
|
const ORPC_NAME = "orpc";
|
|
3906
3906
|
const ORPC_SHARED_PACKAGE_NAME = "@orpc/shared";
|
|
3907
|
-
const ORPC_SHARED_PACKAGE_VERSION = "1.
|
|
3907
|
+
const ORPC_SHARED_PACKAGE_VERSION = "1.13.2";
|
|
3908
3908
|
|
|
3909
3909
|
class AbortError extends Error {
|
|
3910
3910
|
constructor(...rest) {
|
|
@@ -4202,7 +4202,7 @@ function tryDecodeURIComponent(value) {
|
|
|
4202
4202
|
}
|
|
4203
4203
|
|
|
4204
4204
|
const ORPC_CLIENT_PACKAGE_NAME = "@orpc/client";
|
|
4205
|
-
const ORPC_CLIENT_PACKAGE_VERSION = "1.
|
|
4205
|
+
const ORPC_CLIENT_PACKAGE_VERSION = "1.13.2";
|
|
4206
4206
|
|
|
4207
4207
|
const COMMON_ORPC_ERROR_DEFS = {
|
|
4208
4208
|
BAD_REQUEST: {
|
|
@@ -4672,61 +4672,417 @@ function isContractProcedure(item) {
|
|
|
4672
4672
|
return (typeof item === "object" || typeof item === "function") && item !== null && "~orpc" in item && typeof item["~orpc"] === "object" && item["~orpc"] !== null && "errorMap" in item["~orpc"] && "route" in item["~orpc"] && "meta" in item["~orpc"];
|
|
4673
4673
|
}
|
|
4674
4674
|
|
|
4675
|
-
function
|
|
4676
|
-
|
|
4675
|
+
function toEventIterator(stream, options = {}) {
|
|
4676
|
+
const eventStream = stream?.pipeThrough(new TextDecoderStream()).pipeThrough(new EventDecoderStream());
|
|
4677
|
+
const reader = eventStream?.getReader();
|
|
4678
|
+
let span;
|
|
4679
|
+
let isCancelled = false;
|
|
4680
|
+
return new AsyncIteratorClass(async () => {
|
|
4681
|
+
span ??= startSpan("consume_event_iterator_stream");
|
|
4682
|
+
try {
|
|
4683
|
+
while (true) {
|
|
4684
|
+
if (reader === void 0) {
|
|
4685
|
+
return { done: true, value: void 0 };
|
|
4686
|
+
}
|
|
4687
|
+
const { done, value } = await runInSpanContext(span, () => reader.read());
|
|
4688
|
+
if (done) {
|
|
4689
|
+
if (isCancelled) {
|
|
4690
|
+
throw new AbortError("Stream was cancelled");
|
|
4691
|
+
}
|
|
4692
|
+
return { done: true, value: void 0 };
|
|
4693
|
+
}
|
|
4694
|
+
switch (value.event) {
|
|
4695
|
+
case "message": {
|
|
4696
|
+
let message = parseEmptyableJSON(value.data);
|
|
4697
|
+
if (isTypescriptObject(message)) {
|
|
4698
|
+
message = withEventMeta(message, value);
|
|
4699
|
+
}
|
|
4700
|
+
span?.addEvent("message");
|
|
4701
|
+
return { done: false, value: message };
|
|
4702
|
+
}
|
|
4703
|
+
case "error": {
|
|
4704
|
+
let error = new ErrorEvent({
|
|
4705
|
+
data: parseEmptyableJSON(value.data)
|
|
4706
|
+
});
|
|
4707
|
+
error = withEventMeta(error, value);
|
|
4708
|
+
span?.addEvent("error");
|
|
4709
|
+
throw error;
|
|
4710
|
+
}
|
|
4711
|
+
case "done": {
|
|
4712
|
+
let done2 = parseEmptyableJSON(value.data);
|
|
4713
|
+
if (isTypescriptObject(done2)) {
|
|
4714
|
+
done2 = withEventMeta(done2, value);
|
|
4715
|
+
}
|
|
4716
|
+
span?.addEvent("done");
|
|
4717
|
+
return { done: true, value: done2 };
|
|
4718
|
+
}
|
|
4719
|
+
default: {
|
|
4720
|
+
span?.addEvent("maybe_keepalive");
|
|
4721
|
+
}
|
|
4722
|
+
}
|
|
4723
|
+
}
|
|
4724
|
+
} catch (e) {
|
|
4725
|
+
if (!(e instanceof ErrorEvent)) {
|
|
4726
|
+
setSpanError(span, e, options);
|
|
4727
|
+
}
|
|
4728
|
+
throw e;
|
|
4729
|
+
}
|
|
4730
|
+
}, async (reason) => {
|
|
4731
|
+
try {
|
|
4732
|
+
if (reason !== "next") {
|
|
4733
|
+
isCancelled = true;
|
|
4734
|
+
span?.addEvent("cancelled");
|
|
4735
|
+
}
|
|
4736
|
+
await runInSpanContext(span, () => reader?.cancel());
|
|
4737
|
+
} catch (e) {
|
|
4738
|
+
setSpanError(span, e, options);
|
|
4739
|
+
throw e;
|
|
4740
|
+
} finally {
|
|
4741
|
+
span?.end();
|
|
4742
|
+
}
|
|
4743
|
+
});
|
|
4744
|
+
}
|
|
4745
|
+
function toEventStream(iterator, options = {}) {
|
|
4746
|
+
const keepAliveEnabled = options.eventIteratorKeepAliveEnabled ?? true;
|
|
4747
|
+
const keepAliveInterval = options.eventIteratorKeepAliveInterval ?? 5e3;
|
|
4748
|
+
const keepAliveComment = options.eventIteratorKeepAliveComment ?? "";
|
|
4749
|
+
const initialCommentEnabled = options.eventIteratorInitialCommentEnabled ?? true;
|
|
4750
|
+
const initialComment = options.eventIteratorInitialComment ?? "";
|
|
4751
|
+
let cancelled = false;
|
|
4752
|
+
let timeout;
|
|
4753
|
+
let span;
|
|
4754
|
+
const stream = new ReadableStream({
|
|
4755
|
+
start(controller) {
|
|
4756
|
+
span = startSpan("stream_event_iterator");
|
|
4757
|
+
if (initialCommentEnabled) {
|
|
4758
|
+
controller.enqueue(encodeEventMessage({
|
|
4759
|
+
comments: [initialComment]
|
|
4760
|
+
}));
|
|
4761
|
+
}
|
|
4762
|
+
},
|
|
4763
|
+
async pull(controller) {
|
|
4764
|
+
try {
|
|
4765
|
+
if (keepAliveEnabled) {
|
|
4766
|
+
timeout = setInterval(() => {
|
|
4767
|
+
controller.enqueue(encodeEventMessage({
|
|
4768
|
+
comments: [keepAliveComment]
|
|
4769
|
+
}));
|
|
4770
|
+
span?.addEvent("keepalive");
|
|
4771
|
+
}, keepAliveInterval);
|
|
4772
|
+
}
|
|
4773
|
+
const value = await runInSpanContext(span, () => iterator.next());
|
|
4774
|
+
clearInterval(timeout);
|
|
4775
|
+
if (cancelled) {
|
|
4776
|
+
return;
|
|
4777
|
+
}
|
|
4778
|
+
const meta = getEventMeta(value.value);
|
|
4779
|
+
if (!value.done || value.value !== void 0 || meta !== void 0) {
|
|
4780
|
+
const event = value.done ? "done" : "message";
|
|
4781
|
+
controller.enqueue(encodeEventMessage({
|
|
4782
|
+
...meta,
|
|
4783
|
+
event,
|
|
4784
|
+
data: stringifyJSON(value.value)
|
|
4785
|
+
}));
|
|
4786
|
+
span?.addEvent(event);
|
|
4787
|
+
}
|
|
4788
|
+
if (value.done) {
|
|
4789
|
+
controller.close();
|
|
4790
|
+
span?.end();
|
|
4791
|
+
}
|
|
4792
|
+
} catch (err) {
|
|
4793
|
+
clearInterval(timeout);
|
|
4794
|
+
if (cancelled) {
|
|
4795
|
+
return;
|
|
4796
|
+
}
|
|
4797
|
+
if (err instanceof ErrorEvent) {
|
|
4798
|
+
controller.enqueue(encodeEventMessage({
|
|
4799
|
+
...getEventMeta(err),
|
|
4800
|
+
event: "error",
|
|
4801
|
+
data: stringifyJSON(err.data)
|
|
4802
|
+
}));
|
|
4803
|
+
span?.addEvent("error");
|
|
4804
|
+
controller.close();
|
|
4805
|
+
} else {
|
|
4806
|
+
setSpanError(span, err);
|
|
4807
|
+
controller.error(err);
|
|
4808
|
+
}
|
|
4809
|
+
span?.end();
|
|
4810
|
+
}
|
|
4811
|
+
},
|
|
4812
|
+
async cancel() {
|
|
4813
|
+
try {
|
|
4814
|
+
cancelled = true;
|
|
4815
|
+
clearInterval(timeout);
|
|
4816
|
+
span?.addEvent("cancelled");
|
|
4817
|
+
await runInSpanContext(span, () => iterator.return?.());
|
|
4818
|
+
} catch (e) {
|
|
4819
|
+
setSpanError(span, e);
|
|
4820
|
+
throw e;
|
|
4821
|
+
} finally {
|
|
4822
|
+
span?.end();
|
|
4823
|
+
}
|
|
4824
|
+
}
|
|
4825
|
+
}).pipeThrough(new TextEncoderStream());
|
|
4826
|
+
return stream;
|
|
4677
4827
|
}
|
|
4678
4828
|
|
|
4679
|
-
function
|
|
4680
|
-
return
|
|
4829
|
+
function toStandardBody(re, options = {}) {
|
|
4830
|
+
return runWithSpan(
|
|
4831
|
+
{ name: "parse_standard_body", signal: options.signal },
|
|
4832
|
+
async () => {
|
|
4833
|
+
const contentDisposition = re.headers.get("content-disposition");
|
|
4834
|
+
if (typeof contentDisposition === "string") {
|
|
4835
|
+
const fileName = getFilenameFromContentDisposition(contentDisposition) ?? "blob";
|
|
4836
|
+
const blob2 = await re.blob();
|
|
4837
|
+
return new File([blob2], fileName, {
|
|
4838
|
+
type: blob2.type
|
|
4839
|
+
});
|
|
4840
|
+
}
|
|
4841
|
+
const contentType = re.headers.get("content-type");
|
|
4842
|
+
if (!contentType || contentType.startsWith("application/json")) {
|
|
4843
|
+
const text = await re.text();
|
|
4844
|
+
return parseEmptyableJSON(text);
|
|
4845
|
+
}
|
|
4846
|
+
if (contentType.startsWith("multipart/form-data")) {
|
|
4847
|
+
return await re.formData();
|
|
4848
|
+
}
|
|
4849
|
+
if (contentType.startsWith("application/x-www-form-urlencoded")) {
|
|
4850
|
+
const text = await re.text();
|
|
4851
|
+
return new URLSearchParams(text);
|
|
4852
|
+
}
|
|
4853
|
+
if (contentType.startsWith("text/event-stream")) {
|
|
4854
|
+
return toEventIterator(re.body, options);
|
|
4855
|
+
}
|
|
4856
|
+
if (contentType.startsWith("text/plain")) {
|
|
4857
|
+
return await re.text();
|
|
4858
|
+
}
|
|
4859
|
+
const blob = await re.blob();
|
|
4860
|
+
return new File([blob], "blob", {
|
|
4861
|
+
type: blob.type
|
|
4862
|
+
});
|
|
4863
|
+
}
|
|
4864
|
+
);
|
|
4681
4865
|
}
|
|
4682
|
-
function
|
|
4683
|
-
|
|
4684
|
-
|
|
4866
|
+
function toFetchBody(body, headers, options = {}) {
|
|
4867
|
+
const currentContentDisposition = headers.get("content-disposition");
|
|
4868
|
+
headers.delete("content-type");
|
|
4869
|
+
headers.delete("content-disposition");
|
|
4870
|
+
if (body === void 0) {
|
|
4871
|
+
return void 0;
|
|
4685
4872
|
}
|
|
4686
|
-
|
|
4687
|
-
|
|
4688
|
-
|
|
4689
|
-
|
|
4690
|
-
|
|
4691
|
-
|
|
4692
|
-
|
|
4693
|
-
|
|
4694
|
-
tags: [...tags, ...route.tags ?? []]
|
|
4695
|
-
};
|
|
4696
|
-
}
|
|
4697
|
-
function mergePrefix(a, b) {
|
|
4698
|
-
return a ? `${a}${b}` : b;
|
|
4699
|
-
}
|
|
4700
|
-
function mergeTags(a, b) {
|
|
4701
|
-
return a ? [...a, ...b] : b;
|
|
4702
|
-
}
|
|
4703
|
-
function enhanceRoute(route, options) {
|
|
4704
|
-
let router = route;
|
|
4705
|
-
if (options.prefix) {
|
|
4706
|
-
router = prefixRoute(router, options.prefix);
|
|
4873
|
+
if (body instanceof Blob) {
|
|
4874
|
+
headers.set("content-type", body.type);
|
|
4875
|
+
headers.set("content-length", body.size.toString());
|
|
4876
|
+
headers.set(
|
|
4877
|
+
"content-disposition",
|
|
4878
|
+
currentContentDisposition ?? generateContentDisposition(body instanceof File ? body.name : "blob")
|
|
4879
|
+
);
|
|
4880
|
+
return body;
|
|
4707
4881
|
}
|
|
4708
|
-
if (
|
|
4709
|
-
|
|
4882
|
+
if (body instanceof FormData) {
|
|
4883
|
+
return body;
|
|
4710
4884
|
}
|
|
4711
|
-
|
|
4712
|
-
|
|
4713
|
-
function enhanceContractRouter(router, options) {
|
|
4714
|
-
if (isContractProcedure(router)) {
|
|
4715
|
-
const enhanced2 = new ContractProcedure({
|
|
4716
|
-
...router["~orpc"],
|
|
4717
|
-
errorMap: mergeErrorMap(options.errorMap, router["~orpc"].errorMap),
|
|
4718
|
-
route: enhanceRoute(router["~orpc"].route, options)
|
|
4719
|
-
});
|
|
4720
|
-
return enhanced2;
|
|
4885
|
+
if (body instanceof URLSearchParams) {
|
|
4886
|
+
return body;
|
|
4721
4887
|
}
|
|
4722
|
-
|
|
4723
|
-
|
|
4724
|
-
|
|
4888
|
+
if (isAsyncIteratorObject(body)) {
|
|
4889
|
+
headers.set("content-type", "text/event-stream");
|
|
4890
|
+
return toEventStream(body, options);
|
|
4725
4891
|
}
|
|
4726
|
-
|
|
4892
|
+
headers.set("content-type", "application/json");
|
|
4893
|
+
return stringifyJSON(body);
|
|
4727
4894
|
}
|
|
4728
4895
|
|
|
4729
|
-
|
|
4896
|
+
function toStandardHeaders$1(headers, standardHeaders = {}) {
|
|
4897
|
+
headers.forEach((value, key) => {
|
|
4898
|
+
if (Array.isArray(standardHeaders[key])) {
|
|
4899
|
+
standardHeaders[key].push(value);
|
|
4900
|
+
} else if (standardHeaders[key] !== void 0) {
|
|
4901
|
+
standardHeaders[key] = [standardHeaders[key], value];
|
|
4902
|
+
} else {
|
|
4903
|
+
standardHeaders[key] = value;
|
|
4904
|
+
}
|
|
4905
|
+
});
|
|
4906
|
+
return standardHeaders;
|
|
4907
|
+
}
|
|
4908
|
+
function toFetchHeaders(headers, fetchHeaders = new Headers()) {
|
|
4909
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
4910
|
+
if (Array.isArray(value)) {
|
|
4911
|
+
for (const v of value) {
|
|
4912
|
+
fetchHeaders.append(key, v);
|
|
4913
|
+
}
|
|
4914
|
+
} else if (value !== void 0) {
|
|
4915
|
+
fetchHeaders.append(key, value);
|
|
4916
|
+
}
|
|
4917
|
+
}
|
|
4918
|
+
return fetchHeaders;
|
|
4919
|
+
}
|
|
4920
|
+
function toFetchRequest(request, options = {}) {
|
|
4921
|
+
const headers = toFetchHeaders(request.headers);
|
|
4922
|
+
const body = toFetchBody(request.body, headers, options);
|
|
4923
|
+
return new Request(request.url, {
|
|
4924
|
+
signal: request.signal,
|
|
4925
|
+
method: request.method,
|
|
4926
|
+
headers,
|
|
4927
|
+
body
|
|
4928
|
+
});
|
|
4929
|
+
}
|
|
4930
|
+
function toStandardLazyResponse(response, options = {}) {
|
|
4931
|
+
return {
|
|
4932
|
+
body: once(() => toStandardBody(response, options)),
|
|
4933
|
+
status: response.status,
|
|
4934
|
+
get headers() {
|
|
4935
|
+
const headers = toStandardHeaders$1(response.headers);
|
|
4936
|
+
Object.defineProperty(this, "headers", { value: headers, writable: true });
|
|
4937
|
+
return headers;
|
|
4938
|
+
},
|
|
4939
|
+
set headers(value) {
|
|
4940
|
+
Object.defineProperty(this, "headers", { value, writable: true });
|
|
4941
|
+
}
|
|
4942
|
+
};
|
|
4943
|
+
}
|
|
4944
|
+
|
|
4945
|
+
class CompositeStandardLinkPlugin {
|
|
4946
|
+
plugins;
|
|
4947
|
+
constructor(plugins = []) {
|
|
4948
|
+
this.plugins = [...plugins].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
|
|
4949
|
+
}
|
|
4950
|
+
init(options) {
|
|
4951
|
+
for (const plugin of this.plugins) {
|
|
4952
|
+
plugin.init?.(options);
|
|
4953
|
+
}
|
|
4954
|
+
}
|
|
4955
|
+
}
|
|
4956
|
+
|
|
4957
|
+
class StandardLink {
|
|
4958
|
+
constructor(codec, sender, options = {}) {
|
|
4959
|
+
this.codec = codec;
|
|
4960
|
+
this.sender = sender;
|
|
4961
|
+
const plugin = new CompositeStandardLinkPlugin(options.plugins);
|
|
4962
|
+
plugin.init(options);
|
|
4963
|
+
this.interceptors = toArray(options.interceptors);
|
|
4964
|
+
this.clientInterceptors = toArray(options.clientInterceptors);
|
|
4965
|
+
}
|
|
4966
|
+
interceptors;
|
|
4967
|
+
clientInterceptors;
|
|
4968
|
+
call(path, input, options) {
|
|
4969
|
+
return runWithSpan(
|
|
4970
|
+
{ name: `${ORPC_NAME}.${path.join("/")}`, signal: options.signal },
|
|
4971
|
+
(span) => {
|
|
4972
|
+
span?.setAttribute("rpc.system", ORPC_NAME);
|
|
4973
|
+
span?.setAttribute("rpc.method", path.join("."));
|
|
4974
|
+
if (isAsyncIteratorObject(input)) {
|
|
4975
|
+
input = asyncIteratorWithSpan(
|
|
4976
|
+
{ name: "consume_event_iterator_input", signal: options.signal },
|
|
4977
|
+
input
|
|
4978
|
+
);
|
|
4979
|
+
}
|
|
4980
|
+
return intercept(this.interceptors, { ...options, path, input }, async ({ path: path2, input: input2, ...options2 }) => {
|
|
4981
|
+
const otelConfig = getGlobalOtelConfig();
|
|
4982
|
+
let otelContext;
|
|
4983
|
+
const currentSpan = otelConfig?.trace.getActiveSpan() ?? span;
|
|
4984
|
+
if (currentSpan && otelConfig) {
|
|
4985
|
+
otelContext = otelConfig?.trace.setSpan(otelConfig.context.active(), currentSpan);
|
|
4986
|
+
}
|
|
4987
|
+
const request = await runWithSpan(
|
|
4988
|
+
{ name: "encode_request", context: otelContext },
|
|
4989
|
+
() => this.codec.encode(path2, input2, options2)
|
|
4990
|
+
);
|
|
4991
|
+
const response = await intercept(
|
|
4992
|
+
this.clientInterceptors,
|
|
4993
|
+
{ ...options2, input: input2, path: path2, request },
|
|
4994
|
+
({ input: input3, path: path3, request: request2, ...options3 }) => {
|
|
4995
|
+
return runWithSpan(
|
|
4996
|
+
{ name: "send_request", signal: options3.signal, context: otelContext },
|
|
4997
|
+
() => this.sender.call(request2, options3, path3, input3)
|
|
4998
|
+
);
|
|
4999
|
+
}
|
|
5000
|
+
);
|
|
5001
|
+
const output = await runWithSpan(
|
|
5002
|
+
{ name: "decode_response", context: otelContext },
|
|
5003
|
+
() => this.codec.decode(response, options2, path2, input2)
|
|
5004
|
+
);
|
|
5005
|
+
if (isAsyncIteratorObject(output)) {
|
|
5006
|
+
return asyncIteratorWithSpan(
|
|
5007
|
+
{ name: "consume_event_iterator_output", signal: options2.signal },
|
|
5008
|
+
output
|
|
5009
|
+
);
|
|
5010
|
+
}
|
|
5011
|
+
return output;
|
|
5012
|
+
});
|
|
5013
|
+
}
|
|
5014
|
+
);
|
|
5015
|
+
}
|
|
5016
|
+
}
|
|
5017
|
+
|
|
5018
|
+
function toHttpPath(path) {
|
|
5019
|
+
return `/${path.map(encodeURIComponent).join("/")}`;
|
|
5020
|
+
}
|
|
5021
|
+
function toStandardHeaders(headers) {
|
|
5022
|
+
if (typeof headers.forEach === "function") {
|
|
5023
|
+
return toStandardHeaders$1(headers);
|
|
5024
|
+
}
|
|
5025
|
+
return headers;
|
|
5026
|
+
}
|
|
5027
|
+
function getMalformedResponseErrorCode(status) {
|
|
5028
|
+
return Object.entries(COMMON_ORPC_ERROR_DEFS).find(([, def]) => def.status === status)?.[0] ?? "MALFORMED_ORPC_ERROR_RESPONSE";
|
|
5029
|
+
}
|
|
5030
|
+
|
|
5031
|
+
function mergeMeta(meta1, meta2) {
|
|
5032
|
+
return { ...meta1, ...meta2 };
|
|
5033
|
+
}
|
|
5034
|
+
|
|
5035
|
+
function mergeRoute(a, b) {
|
|
5036
|
+
return { ...a, ...b };
|
|
5037
|
+
}
|
|
5038
|
+
function prefixRoute(route, prefix) {
|
|
5039
|
+
if (!route.path) {
|
|
5040
|
+
return route;
|
|
5041
|
+
}
|
|
5042
|
+
return {
|
|
5043
|
+
...route,
|
|
5044
|
+
path: `${prefix}${route.path}`
|
|
5045
|
+
};
|
|
5046
|
+
}
|
|
5047
|
+
function unshiftTagRoute(route, tags) {
|
|
5048
|
+
return {
|
|
5049
|
+
...route,
|
|
5050
|
+
tags: [...tags, ...route.tags ?? []]
|
|
5051
|
+
};
|
|
5052
|
+
}
|
|
5053
|
+
function mergePrefix(a, b) {
|
|
5054
|
+
return a ? `${a}${b}` : b;
|
|
5055
|
+
}
|
|
5056
|
+
function mergeTags(a, b) {
|
|
5057
|
+
return a ? [...a, ...b] : b;
|
|
5058
|
+
}
|
|
5059
|
+
function enhanceRoute(route, options) {
|
|
5060
|
+
let router = route;
|
|
5061
|
+
if (options.prefix) {
|
|
5062
|
+
router = prefixRoute(router, options.prefix);
|
|
5063
|
+
}
|
|
5064
|
+
if (options.tags?.length) {
|
|
5065
|
+
router = unshiftTagRoute(router, options.tags);
|
|
5066
|
+
}
|
|
5067
|
+
return router;
|
|
5068
|
+
}
|
|
5069
|
+
function enhanceContractRouter(router, options) {
|
|
5070
|
+
if (isContractProcedure(router)) {
|
|
5071
|
+
const enhanced2 = new ContractProcedure({
|
|
5072
|
+
...router["~orpc"],
|
|
5073
|
+
errorMap: mergeErrorMap(options.errorMap, router["~orpc"].errorMap),
|
|
5074
|
+
route: enhanceRoute(router["~orpc"].route, options)
|
|
5075
|
+
});
|
|
5076
|
+
return enhanced2;
|
|
5077
|
+
}
|
|
5078
|
+
const enhanced = {};
|
|
5079
|
+
for (const key in router) {
|
|
5080
|
+
enhanced[key] = enhanceContractRouter(router[key], options);
|
|
5081
|
+
}
|
|
5082
|
+
return enhanced;
|
|
5083
|
+
}
|
|
5084
|
+
|
|
5085
|
+
class ContractBuilder extends ContractProcedure {
|
|
4730
5086
|
constructor(def) {
|
|
4731
5087
|
super(def);
|
|
4732
5088
|
this["~orpc"].prefix = def.prefix;
|
|
@@ -4756,6 +5112,17 @@ class ContractBuilder extends ContractProcedure {
|
|
|
4756
5112
|
route: initialRoute
|
|
4757
5113
|
});
|
|
4758
5114
|
}
|
|
5115
|
+
/**
|
|
5116
|
+
* Sets or overrides the initial input schema.
|
|
5117
|
+
*
|
|
5118
|
+
* @see {@link https://orpc.dev/docs/procedure#initial-configuration Initial Procedure Configuration Docs}
|
|
5119
|
+
*/
|
|
5120
|
+
$input(initialInputSchema) {
|
|
5121
|
+
return new ContractBuilder({
|
|
5122
|
+
...this["~orpc"],
|
|
5123
|
+
inputSchema: initialInputSchema
|
|
5124
|
+
});
|
|
5125
|
+
}
|
|
4759
5126
|
/**
|
|
4760
5127
|
* Adds type-safe custom errors to the contract.
|
|
4761
5128
|
* The provided errors are spared-merged with any existing errors in the contract.
|
|
@@ -5599,6 +5966,7 @@ let Examples;
|
|
|
5599
5966
|
reserved: 100,
|
|
5600
5967
|
order: 0,
|
|
5601
5968
|
location: Location,
|
|
5969
|
+
passcode: void 0,
|
|
5602
5970
|
tenantId: Tenant.id,
|
|
5603
5971
|
deleted: false,
|
|
5604
5972
|
orderPadded: "0000000000"
|
|
@@ -5613,6 +5981,8 @@ let Examples;
|
|
|
5613
5981
|
eventId: Event.id,
|
|
5614
5982
|
eventSlug: Event.slug,
|
|
5615
5983
|
name: "Final Release",
|
|
5984
|
+
subtitle: "Entry before 10pm",
|
|
5985
|
+
description: "Early bird pricing with priority entry. Must present valid ID at gate.",
|
|
5616
5986
|
capacity: 1e5,
|
|
5617
5987
|
limit: -1,
|
|
5618
5988
|
available: 7e4,
|
|
@@ -5628,6 +5998,8 @@ let Examples;
|
|
|
5628
5998
|
booking: 200,
|
|
5629
5999
|
currency: "AUD"
|
|
5630
6000
|
},
|
|
6001
|
+
visibility: "ALWAYS",
|
|
6002
|
+
passcode: void 0,
|
|
5631
6003
|
tenantId: Tenant.id,
|
|
5632
6004
|
deleted: false,
|
|
5633
6005
|
orderPadded: "0000000000"
|
|
@@ -5646,7 +6018,7 @@ let Examples;
|
|
|
5646
6018
|
gatewayId: "7489cb17-24c5-4acf-a0cf-d93ed38081fe",
|
|
5647
6019
|
gateway: "AIRWALLEX",
|
|
5648
6020
|
teamId: Team.id,
|
|
5649
|
-
|
|
6021
|
+
teamIds: [Team.id],
|
|
5650
6022
|
venueIds: [],
|
|
5651
6023
|
tenantId: Tenant.id
|
|
5652
6024
|
};
|
|
@@ -5884,6 +6256,7 @@ let Examples;
|
|
|
5884
6256
|
source: "CARD"
|
|
5885
6257
|
},
|
|
5886
6258
|
payoutIds: [Payout.id],
|
|
6259
|
+
refunds: [],
|
|
5887
6260
|
tenantId: Examples.Tenant.id,
|
|
5888
6261
|
checkoutUrl: `${Tenant.baseUrl.dev}/checkout/ord_01jps5cgsfgve5b5g2666kyryh`
|
|
5889
6262
|
};
|
|
@@ -5900,6 +6273,29 @@ let Examples;
|
|
|
5900
6273
|
deviceId: "dev_01jq4rjvrgar43zwvyakbje22m",
|
|
5901
6274
|
kind: "CHECK_IN"
|
|
5902
6275
|
};
|
|
6276
|
+
_Examples.OrderRefund = {
|
|
6277
|
+
id: "rfd_01jps5cgsfgve5b5g2666kyryh",
|
|
6278
|
+
idempotencyKey: "refund_12345_customer_request",
|
|
6279
|
+
status: "SUCCEEDED",
|
|
6280
|
+
processedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
6281
|
+
amount: 1200,
|
|
6282
|
+
shippingRefunded: 0,
|
|
6283
|
+
reason: "CUSTOMER_REQUEST",
|
|
6284
|
+
note: "Customer requested refund due to schedule conflict",
|
|
6285
|
+
ticketsCancelled: true,
|
|
6286
|
+
ticketsCancelledCount: 2,
|
|
6287
|
+
gateway: "STRIPE",
|
|
6288
|
+
gatewayRefundId: "re_1234567890abcdef",
|
|
6289
|
+
initiatedBy: "USER",
|
|
6290
|
+
userId: User.id,
|
|
6291
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
6292
|
+
};
|
|
6293
|
+
_Examples.OrderRefundItem = {
|
|
6294
|
+
orderItemId: OrderItem.id,
|
|
6295
|
+
quantity: 2,
|
|
6296
|
+
amount: 1200,
|
|
6297
|
+
ticketIds: ["tkt_01jps5cgsg0s32w2pr73vbccde"]
|
|
6298
|
+
};
|
|
5903
6299
|
_Examples.Ticket = {
|
|
5904
6300
|
id: "tkt_01jps5cgsg0s32w2pr73vbccde",
|
|
5905
6301
|
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
@@ -5997,6 +6393,153 @@ const CurrencySchema = _enum([
|
|
|
5997
6393
|
description: "Three-letter ISO 4217 currency code for transactions and payouts"
|
|
5998
6394
|
});
|
|
5999
6395
|
|
|
6396
|
+
//#endregion
|
|
6397
|
+
//#region ../contract/src/common/event-category.schema.ts
|
|
6398
|
+
/**
|
|
6399
|
+
* Event categories describing characteristics beyond music genre
|
|
6400
|
+
* Groups: Event Type, Venue Type, Entry, Music, Vibe, Amenities, Other
|
|
6401
|
+
*/
|
|
6402
|
+
const EventCategoryEnum = _enum([
|
|
6403
|
+
"Day Party",
|
|
6404
|
+
"Festival",
|
|
6405
|
+
"Afterparty",
|
|
6406
|
+
"Boat Party",
|
|
6407
|
+
"Pool Party",
|
|
6408
|
+
"Live Performance",
|
|
6409
|
+
"Warehouse",
|
|
6410
|
+
"Open Air",
|
|
6411
|
+
"Rooftop",
|
|
6412
|
+
"Beach Party",
|
|
6413
|
+
"Secret Location",
|
|
6414
|
+
"Doof",
|
|
6415
|
+
"Basement",
|
|
6416
|
+
"Free Entry",
|
|
6417
|
+
"Donation",
|
|
6418
|
+
"Vinyl Only",
|
|
6419
|
+
"Silent Disco",
|
|
6420
|
+
"Underground",
|
|
6421
|
+
"Intimate",
|
|
6422
|
+
"Queer Friendly",
|
|
6423
|
+
"Safe Space",
|
|
6424
|
+
"No Photos",
|
|
6425
|
+
"Rave",
|
|
6426
|
+
"BYO",
|
|
6427
|
+
"Cash Only",
|
|
6428
|
+
"Card Only",
|
|
6429
|
+
"Food Available",
|
|
6430
|
+
"Dress Code"
|
|
6431
|
+
]);
|
|
6432
|
+
const EventCategoriesSchema = array(EventCategoryEnum).max(10).optional().meta({
|
|
6433
|
+
description: "Event characteristics like vibe, venue type, and amenities (up to 10 categories)",
|
|
6434
|
+
examples: [[
|
|
6435
|
+
"Day Party",
|
|
6436
|
+
"Open Air",
|
|
6437
|
+
"Free Entry"
|
|
6438
|
+
]]
|
|
6439
|
+
});
|
|
6440
|
+
|
|
6441
|
+
//#endregion
|
|
6442
|
+
//#region ../contract/src/common/event-genre.schema.ts
|
|
6443
|
+
/**
|
|
6444
|
+
* Music genres organized by category
|
|
6445
|
+
* Categories: House, Techno, Bass, Trance, Disco, Hard Dance, Global, Downtempo, Electronic, Non-Electronic
|
|
6446
|
+
*/
|
|
6447
|
+
const EventGenreEnum = _enum([
|
|
6448
|
+
"House",
|
|
6449
|
+
"Deep House",
|
|
6450
|
+
"Tech House",
|
|
6451
|
+
"Progressive House",
|
|
6452
|
+
"Minimal House",
|
|
6453
|
+
"Afro House",
|
|
6454
|
+
"Afro Tech",
|
|
6455
|
+
"Acid House",
|
|
6456
|
+
"Funky House",
|
|
6457
|
+
"Jackin House",
|
|
6458
|
+
"Soulful House",
|
|
6459
|
+
"Tribal House",
|
|
6460
|
+
"Organic House",
|
|
6461
|
+
"Melodic House",
|
|
6462
|
+
"Latin House",
|
|
6463
|
+
"Techno",
|
|
6464
|
+
"Melodic Techno",
|
|
6465
|
+
"Hard Techno",
|
|
6466
|
+
"Industrial Techno",
|
|
6467
|
+
"Minimal Techno",
|
|
6468
|
+
"Detroit Techno",
|
|
6469
|
+
"Dub Techno",
|
|
6470
|
+
"Acid Techno",
|
|
6471
|
+
"Hypnotic Techno",
|
|
6472
|
+
"Bass",
|
|
6473
|
+
"Drum & Bass",
|
|
6474
|
+
"Jungle",
|
|
6475
|
+
"Dubstep",
|
|
6476
|
+
"Bass House",
|
|
6477
|
+
"Breakbeat",
|
|
6478
|
+
"UK Garage",
|
|
6479
|
+
"Bassline",
|
|
6480
|
+
"Grime",
|
|
6481
|
+
"Liquid DnB",
|
|
6482
|
+
"Neurofunk",
|
|
6483
|
+
"Footwork",
|
|
6484
|
+
"Jersey Club",
|
|
6485
|
+
"Trance",
|
|
6486
|
+
"Psytrance",
|
|
6487
|
+
"Progressive Trance",
|
|
6488
|
+
"Uplifting Trance",
|
|
6489
|
+
"Vocal Trance",
|
|
6490
|
+
"Goa Trance",
|
|
6491
|
+
"Disco",
|
|
6492
|
+
"Nu Disco",
|
|
6493
|
+
"Italo Disco",
|
|
6494
|
+
"Funk",
|
|
6495
|
+
"Soul",
|
|
6496
|
+
"Balearic",
|
|
6497
|
+
"Boogie",
|
|
6498
|
+
"Hard Dance",
|
|
6499
|
+
"Hardcore",
|
|
6500
|
+
"Hardstyle",
|
|
6501
|
+
"Gabber",
|
|
6502
|
+
"Happy Hardcore",
|
|
6503
|
+
"Global",
|
|
6504
|
+
"Amapiano",
|
|
6505
|
+
"Gqom",
|
|
6506
|
+
"Afrobeats",
|
|
6507
|
+
"Kuduro",
|
|
6508
|
+
"Singeli",
|
|
6509
|
+
"Baile Funk",
|
|
6510
|
+
"Reggaeton",
|
|
6511
|
+
"Dancehall",
|
|
6512
|
+
"Dembow",
|
|
6513
|
+
"Ambient",
|
|
6514
|
+
"Downtempo",
|
|
6515
|
+
"Electronica",
|
|
6516
|
+
"Trip Hop",
|
|
6517
|
+
"Lo-Fi",
|
|
6518
|
+
"Electronic",
|
|
6519
|
+
"Electro",
|
|
6520
|
+
"Synth Pop",
|
|
6521
|
+
"Industrial",
|
|
6522
|
+
"EBM",
|
|
6523
|
+
"Indie Dance",
|
|
6524
|
+
"Experimental",
|
|
6525
|
+
"Non-Electronic",
|
|
6526
|
+
"Hip-Hop",
|
|
6527
|
+
"R&B",
|
|
6528
|
+
"Jazz",
|
|
6529
|
+
"Pop",
|
|
6530
|
+
"Rock",
|
|
6531
|
+
"Reggae",
|
|
6532
|
+
"Live"
|
|
6533
|
+
]);
|
|
6534
|
+
const EventGenresSchema = array(EventGenreEnum).min(1).max(5).meta({
|
|
6535
|
+
description: "Music genres for the event (1-5 genres)",
|
|
6536
|
+
examples: [["Tech House", "Melodic Techno"]]
|
|
6537
|
+
});
|
|
6538
|
+
array(EventGenreEnum).max(5).optional().meta({
|
|
6539
|
+
description: "Music genres for the event (up to 5 genres)",
|
|
6540
|
+
examples: [["Tech House", "Melodic Techno"]]
|
|
6541
|
+
});
|
|
6542
|
+
|
|
6000
6543
|
//#endregion
|
|
6001
6544
|
//#region ../contract/src/common/id.schema.ts
|
|
6002
6545
|
/**
|
|
@@ -6124,6 +6667,14 @@ const AdmissionSchema = object({
|
|
|
6124
6667
|
description: "The display name of the admission type shown to customers",
|
|
6125
6668
|
examples: [Examples.Admission.name]
|
|
6126
6669
|
}),
|
|
6670
|
+
subtitle: string$1().max(100).optional().meta({
|
|
6671
|
+
description: "Short supporting text shown below the admission name",
|
|
6672
|
+
examples: [Examples.Admission.subtitle]
|
|
6673
|
+
}),
|
|
6674
|
+
description: string$1().max(500).optional().meta({
|
|
6675
|
+
description: "Detailed information shown when customers expand 'More info'",
|
|
6676
|
+
examples: [Examples.Admission.description]
|
|
6677
|
+
}),
|
|
6127
6678
|
capacity: number$1().min(-1).prefault(-1).meta({
|
|
6128
6679
|
examples: [Examples.Admission.capacity],
|
|
6129
6680
|
description: "Maximum number of tickets that can be sold for this admission type. A value of -1 indicates unlimited"
|
|
@@ -6189,6 +6740,18 @@ const AdmissionSchema = object({
|
|
|
6189
6740
|
examples: [Examples.Admission.price],
|
|
6190
6741
|
description: "Pricing details for this admission type, including base cost and fees in cents, and currency"
|
|
6191
6742
|
}),
|
|
6743
|
+
visibility: _enum([
|
|
6744
|
+
"ALWAYS",
|
|
6745
|
+
"STACKED",
|
|
6746
|
+
"HIDDEN"
|
|
6747
|
+
]).prefault("ALWAYS").meta({
|
|
6748
|
+
examples: ["ALWAYS"],
|
|
6749
|
+
description: "Controls how this admission type is displayed: 'ALWAYS' shows it at all times, 'STACKED' reveals it when higher-priority tiers sell out, 'HIDDEN' requires a passcode to view"
|
|
6750
|
+
}),
|
|
6751
|
+
passcode: string$1().optional().meta({
|
|
6752
|
+
examples: ["VIPACCESS"],
|
|
6753
|
+
description: "Code required to reveal this admission type when visibility is 'HIDDEN'. Case-insensitive comparison"
|
|
6754
|
+
}),
|
|
6192
6755
|
sectionId: SectionIdSchema.nullable().optional().meta({
|
|
6193
6756
|
examples: [Examples.Admission.sectionId],
|
|
6194
6757
|
description: "Identifier of the section this admission type belongs to, if any"
|
|
@@ -6413,8 +6976,8 @@ const EventPerformanceSummaryResponseSchema = object({
|
|
|
6413
6976
|
*/
|
|
6414
6977
|
const EventPerformanceTicketsGetSchema = object({
|
|
6415
6978
|
eventId: string$1().describe("Event identifier"),
|
|
6416
|
-
startDate: string$1().describe("Start date"),
|
|
6417
|
-
endDate: string$1().describe("End date"),
|
|
6979
|
+
startDate: string$1().describe("Start date (YYYY-MM-DD)"),
|
|
6980
|
+
endDate: string$1().describe("End date (YYYY-MM-DD)"),
|
|
6418
6981
|
granularity: _enum([
|
|
6419
6982
|
"HOUR",
|
|
6420
6983
|
"DAY",
|
|
@@ -6905,8 +7468,8 @@ const IndividualPromoterPerformanceSummaryResponseSchema = object({
|
|
|
6905
7468
|
*/
|
|
6906
7469
|
const IndividualPromoterPerformanceRevenueGetSchema = object({
|
|
6907
7470
|
promoterId: string$1().describe("Promoter identifier"),
|
|
6908
|
-
startDate: string$1().describe("Start date"),
|
|
6909
|
-
endDate: string$1().describe("End date"),
|
|
7471
|
+
startDate: string$1().describe("Start date (YYYY-MM-DD)"),
|
|
7472
|
+
endDate: string$1().describe("End date (YYYY-MM-DD)"),
|
|
6910
7473
|
granularity: _enum([
|
|
6911
7474
|
"HOUR",
|
|
6912
7475
|
"DAY",
|
|
@@ -6950,8 +7513,8 @@ const IndividualPromoterPerformanceRevenueResponseSchema = object({
|
|
|
6950
7513
|
*/
|
|
6951
7514
|
const IndividualPromoterPerformanceEventsGetSchema = object({
|
|
6952
7515
|
promoterId: string$1().describe("Promoter identifier"),
|
|
6953
|
-
startDate: string$1().describe("Start date (
|
|
6954
|
-
endDate: string$1().describe("End date (
|
|
7516
|
+
startDate: string$1().describe("Start date (YYYY-MM-DD)"),
|
|
7517
|
+
endDate: string$1().describe("End date (YYYY-MM-DD)"),
|
|
6955
7518
|
limit: number$1().optional().default(5).describe("Maximum number of events to return")
|
|
6956
7519
|
});
|
|
6957
7520
|
/**
|
|
@@ -7289,6 +7852,8 @@ const TeamPerformanceTrackingResponseSchema = object({
|
|
|
7289
7852
|
* https://segment.com/docs/connections/spec/ecommerce/v2/
|
|
7290
7853
|
*/
|
|
7291
7854
|
const TrackingEventTypeEnum = _enum([
|
|
7855
|
+
"Page Viewed",
|
|
7856
|
+
"Screen Viewed",
|
|
7292
7857
|
"Products Searched",
|
|
7293
7858
|
"Product List Viewed",
|
|
7294
7859
|
"Product List Filtered",
|
|
@@ -7318,6 +7883,7 @@ const TrackingEventTypeEnum = _enum([
|
|
|
7318
7883
|
"Cart Shared",
|
|
7319
7884
|
"Product Reviewed"
|
|
7320
7885
|
]);
|
|
7886
|
+
const TrackingEventType = TrackingEventTypeEnum.enum;
|
|
7321
7887
|
|
|
7322
7888
|
//#endregion
|
|
7323
7889
|
//#region ../contract/src/analytics/tracking-event.schema.ts
|
|
@@ -7477,7 +8043,7 @@ const TrackingEventPropertiesSchema = object({
|
|
|
7477
8043
|
const TrackingEventContextSchema = object({
|
|
7478
8044
|
session_id: string$1(),
|
|
7479
8045
|
user_id: string$1().optional(),
|
|
7480
|
-
anonymous_id: string$1(),
|
|
8046
|
+
anonymous_id: string$1().optional(),
|
|
7481
8047
|
utm_source: string$1().optional(),
|
|
7482
8048
|
utm_medium: string$1().optional(),
|
|
7483
8049
|
utm_campaign: string$1().optional(),
|
|
@@ -7506,9 +8072,9 @@ const TrackingEventContextSchema = object({
|
|
|
7506
8072
|
});
|
|
7507
8073
|
const TrackingEventSchema = object({
|
|
7508
8074
|
id: string$1(),
|
|
7509
|
-
eventId: string$1().describe("Event being tracked (evt_123)"),
|
|
7510
|
-
teamId: string$1().describe("Team ID (team_123)"),
|
|
7511
|
-
promoterId: string$1().describe("Promoter ID (pmt_123)"),
|
|
8075
|
+
eventId: string$1().min(1).describe("Event being tracked (evt_123)"),
|
|
8076
|
+
teamId: string$1().min(1).describe("Team ID (team_123)"),
|
|
8077
|
+
promoterId: string$1().min(1).describe("Promoter ID (pmt_123)"),
|
|
7512
8078
|
eventType: TrackingEventTypeEnum,
|
|
7513
8079
|
timestamp: string$1(),
|
|
7514
8080
|
date: string$1().describe("YYYY-MM-DD"),
|
|
@@ -7573,9 +8139,9 @@ const BeneficiarySchema = object({
|
|
|
7573
8139
|
description: "The identifier assigned by the payment gateway to this account."
|
|
7574
8140
|
}),
|
|
7575
8141
|
teamId: string$1().meta({ description: "Team that owns this beneficiary account." }),
|
|
7576
|
-
|
|
8142
|
+
teamIds: array(string$1()).meta({
|
|
7577
8143
|
examples: [[]],
|
|
7578
|
-
description: "List of
|
|
8144
|
+
description: "List of team IDs this beneficiary is assigned to. Empty array means available to all teams."
|
|
7579
8145
|
}),
|
|
7580
8146
|
venueIds: array(string$1()).meta({
|
|
7581
8147
|
examples: [[]],
|
|
@@ -7640,9 +8206,9 @@ const BeneficiaryCreateSchema = BeneficiarySchema.omit({
|
|
|
7640
8206
|
examples: [Examples.AirwallexBeneficiary],
|
|
7641
8207
|
description: "Airwallex-specific beneficiary details including bank account information and address (required when gateway is AIRWALLEX)"
|
|
7642
8208
|
}),
|
|
7643
|
-
|
|
8209
|
+
teamIds: array(string$1()).optional().default([]).meta({
|
|
7644
8210
|
examples: [[]],
|
|
7645
|
-
description: "List of
|
|
8211
|
+
description: "List of team IDs to assign this beneficiary to. Empty array or omitted means available to all teams."
|
|
7646
8212
|
}),
|
|
7647
8213
|
venueIds: array(string$1()).optional().default([]).meta({
|
|
7648
8214
|
examples: [[]],
|
|
@@ -8068,6 +8634,10 @@ const SectionSchema = object({
|
|
|
8068
8634
|
description: "Display order of the section. Lower numbers appear first in listings"
|
|
8069
8635
|
}),
|
|
8070
8636
|
location: LocationSchema.meta({ description: "Physical location details for the section" }),
|
|
8637
|
+
passcode: string$1().optional().meta({
|
|
8638
|
+
examples: ["VIPACCESS"],
|
|
8639
|
+
description: "Code required to reveal all admissions within this section. Case-insensitive comparison"
|
|
8640
|
+
}),
|
|
8071
8641
|
teamId: string$1().meta({ description: "Team that owns this section. Denormalized for efficient queries." }),
|
|
8072
8642
|
promoterId: string$1().meta({
|
|
8073
8643
|
examples: [Examples.Section.promoterId],
|
|
@@ -8102,7 +8672,7 @@ const EventVisibilityEnum = _enum([
|
|
|
8102
8672
|
"PUBLIC",
|
|
8103
8673
|
"PRIVATE",
|
|
8104
8674
|
"SCHEDULED",
|
|
8105
|
-
"
|
|
8675
|
+
"PASSCODE",
|
|
8106
8676
|
"CANCELLED"
|
|
8107
8677
|
]);
|
|
8108
8678
|
const EventSchema = object({
|
|
@@ -8176,14 +8746,38 @@ const EventSchema = object({
|
|
|
8176
8746
|
examples: [Examples.Promoter.id],
|
|
8177
8747
|
description: "Promoter organizing the event. Must belong to the team."
|
|
8178
8748
|
}),
|
|
8179
|
-
metadata: MetadataSchema
|
|
8749
|
+
metadata: MetadataSchema,
|
|
8750
|
+
genres: array(string$1()).optional().meta({
|
|
8751
|
+
description: "Music genres for the event (1-5 genres)",
|
|
8752
|
+
examples: [["Tech House", "Melodic Techno"]]
|
|
8753
|
+
}),
|
|
8754
|
+
categories: array(string$1()).optional().meta({
|
|
8755
|
+
description: "Event characteristics like vibe, venue type, and amenities (up to 10)",
|
|
8756
|
+
examples: [[
|
|
8757
|
+
"Day Party",
|
|
8758
|
+
"Open Air",
|
|
8759
|
+
"Free Entry"
|
|
8760
|
+
]]
|
|
8761
|
+
}),
|
|
8762
|
+
featured: boolean$1().optional().meta({
|
|
8763
|
+
description: "Whether this event is an editorial pick",
|
|
8764
|
+
examples: [true]
|
|
8765
|
+
}),
|
|
8766
|
+
likes: number$1().int().min(0).optional().meta({
|
|
8767
|
+
description: "Number of users who liked this event",
|
|
8768
|
+
examples: [42]
|
|
8769
|
+
})
|
|
8180
8770
|
}).meta({ description: "event" });
|
|
8181
8771
|
|
|
8182
8772
|
//#endregion
|
|
8183
8773
|
//#region ../contract/src/event/detailed-event.schema.ts
|
|
8184
8774
|
const DetailedEventSchema = EventSchema.extend({
|
|
8185
8775
|
sections: array(SectionSchema),
|
|
8186
|
-
admissions: array(AdmissionSchema)
|
|
8776
|
+
admissions: array(AdmissionSchema),
|
|
8777
|
+
liked: boolean$1().optional().meta({
|
|
8778
|
+
description: "Whether the current user has liked this event",
|
|
8779
|
+
examples: [true, false]
|
|
8780
|
+
})
|
|
8187
8781
|
});
|
|
8188
8782
|
|
|
8189
8783
|
//#endregion
|
|
@@ -8200,13 +8794,15 @@ const EventCreateSchema = EventSchema.omit({
|
|
|
8200
8794
|
status: true,
|
|
8201
8795
|
approval: true,
|
|
8202
8796
|
geohash: true,
|
|
8203
|
-
location: true
|
|
8797
|
+
location: true,
|
|
8798
|
+
featured: true,
|
|
8799
|
+
likes: true
|
|
8204
8800
|
}).extend({
|
|
8205
8801
|
slug: string$1().min(3).max(100).optional().meta({
|
|
8206
8802
|
examples: [Examples.Event.slug],
|
|
8207
8803
|
description: "URL-friendly slug for the event. If not provided, will be automatically generated from the name. Must be unique and between 3 and 100 characters"
|
|
8208
8804
|
}),
|
|
8209
|
-
|
|
8805
|
+
passcode: string$1().optional().meta({ description: "Passcode for protected access to the event" }),
|
|
8210
8806
|
locationId: LocationIdSchema.optional().meta({
|
|
8211
8807
|
examples: ["loc_01jqpjksnsen9vprw95et60t2m"],
|
|
8212
8808
|
description: "ID of an existing location. Either locationId or googlePlaceId must be provided."
|
|
@@ -8214,6 +8810,18 @@ const EventCreateSchema = EventSchema.omit({
|
|
|
8214
8810
|
googlePlaceId: string$1().optional().meta({
|
|
8215
8811
|
examples: ["ChIJN1t_tDeuEmsRUsoyG83frY4"],
|
|
8216
8812
|
description: "Google Place ID to create a new location from. Either locationId or googlePlaceId must be provided."
|
|
8813
|
+
}),
|
|
8814
|
+
genres: EventGenresSchema.optional().meta({
|
|
8815
|
+
description: "Music genres for the event (1-5 genres)",
|
|
8816
|
+
examples: [["Tech House", "Melodic Techno"]]
|
|
8817
|
+
}),
|
|
8818
|
+
categories: EventCategoriesSchema.meta({
|
|
8819
|
+
description: "Event characteristics like vibe, venue type, and amenities (up to 10)",
|
|
8820
|
+
examples: [[
|
|
8821
|
+
"Day Party",
|
|
8822
|
+
"Open Air",
|
|
8823
|
+
"Free Entry"
|
|
8824
|
+
]]
|
|
8217
8825
|
})
|
|
8218
8826
|
}).refine((data) => data.locationId || data.googlePlaceId, { message: "Either locationId or googlePlaceId must be provided" });
|
|
8219
8827
|
|
|
@@ -8224,6 +8832,19 @@ const EventDeleteSchema = object({ key: string$1().min(1).meta({
|
|
|
8224
8832
|
examples: [Examples.Event.id, Examples.Event.slug]
|
|
8225
8833
|
}) });
|
|
8226
8834
|
|
|
8835
|
+
//#endregion
|
|
8836
|
+
//#region ../contract/src/event/event-feature.schema.ts
|
|
8837
|
+
const EventFeatureSchema = object({
|
|
8838
|
+
key: string$1().min(1).meta({
|
|
8839
|
+
description: "Event key - either a unique ID (evt_xxx format) or URL-friendly slug",
|
|
8840
|
+
examples: [Examples.Event.id, Examples.Event.slug]
|
|
8841
|
+
}),
|
|
8842
|
+
featured: boolean$1().meta({
|
|
8843
|
+
description: "Whether the event should be featured (editorial pick)",
|
|
8844
|
+
examples: [true, false]
|
|
8845
|
+
})
|
|
8846
|
+
});
|
|
8847
|
+
|
|
8227
8848
|
//#endregion
|
|
8228
8849
|
//#region ../contract/src/event/event-get.schema.ts
|
|
8229
8850
|
const EventGetSchema = object({
|
|
@@ -8231,7 +8852,7 @@ const EventGetSchema = object({
|
|
|
8231
8852
|
description: "Event key - either a unique ID (evt_xxx format) or URL-friendly slug",
|
|
8232
8853
|
examples: [Examples.Event.id, Examples.Event.slug]
|
|
8233
8854
|
}),
|
|
8234
|
-
|
|
8855
|
+
passcode: string$1().optional().meta({ description: "Passcode for accessing protected events" })
|
|
8235
8856
|
});
|
|
8236
8857
|
|
|
8237
8858
|
//#endregion
|
|
@@ -8245,6 +8866,11 @@ const EventInventorySchema = object({
|
|
|
8245
8866
|
|
|
8246
8867
|
//#endregion
|
|
8247
8868
|
//#region ../contract/src/event/event-list.schema.ts
|
|
8869
|
+
const EventOrderEnum = _enum([
|
|
8870
|
+
"date",
|
|
8871
|
+
"popularity",
|
|
8872
|
+
"recent"
|
|
8873
|
+
]);
|
|
8248
8874
|
const EventListBaseSchema = object({
|
|
8249
8875
|
status: _enum(["UPCOMING", "ENDED"]).optional().meta({
|
|
8250
8876
|
examples: ["UPCOMING"],
|
|
@@ -8258,7 +8884,7 @@ const EventListBaseSchema = object({
|
|
|
8258
8884
|
"PUBLIC",
|
|
8259
8885
|
"PRIVATE",
|
|
8260
8886
|
"SCHEDULED",
|
|
8261
|
-
"
|
|
8887
|
+
"PASSCODE"
|
|
8262
8888
|
]).optional().meta({
|
|
8263
8889
|
examples: ["PUBLIC"],
|
|
8264
8890
|
description: "Filter events by their visibility setting"
|
|
@@ -8293,6 +8919,18 @@ const EventListBaseSchema = object({
|
|
|
8293
8919
|
examples: [20],
|
|
8294
8920
|
description: "Search radius in kilometers from the provided coordinates. Defaults to 20km"
|
|
8295
8921
|
}),
|
|
8922
|
+
country: string$1().optional().meta({
|
|
8923
|
+
examples: ["australia"],
|
|
8924
|
+
description: "Filter by country region slug. Matches events where location.country equals the region name"
|
|
8925
|
+
}),
|
|
8926
|
+
state: string$1().optional().meta({
|
|
8927
|
+
examples: ["nsw"],
|
|
8928
|
+
description: "Filter by state/province region slug. Matches events where location.state equals the region name"
|
|
8929
|
+
}),
|
|
8930
|
+
city: string$1().optional().meta({
|
|
8931
|
+
examples: ["sydney"],
|
|
8932
|
+
description: "Filter by city region slug. Matches events where location.city equals the region name"
|
|
8933
|
+
}),
|
|
8296
8934
|
from: string$1().date().optional().meta({
|
|
8297
8935
|
examples: ["2024-01-01"],
|
|
8298
8936
|
description: "Filter events that start on or after this date (YYYY-MM-DD format). Events with entryStartsAt >= from"
|
|
@@ -8300,13 +8938,35 @@ const EventListBaseSchema = object({
|
|
|
8300
8938
|
to: string$1().date().optional().meta({
|
|
8301
8939
|
examples: ["2024-12-31"],
|
|
8302
8940
|
description: "Filter events that start on or before this date (YYYY-MM-DD format). Events with entryStartsAt <= to"
|
|
8941
|
+
}),
|
|
8942
|
+
genres: array(EventGenreEnum).max(20, "Cannot filter by more than 20 genres").optional().meta({
|
|
8943
|
+
examples: [["Tech House", "Melodic Techno"]],
|
|
8944
|
+
description: "Filter events by music genre(s). Returns events matching ANY of the provided genres (OR logic). Maximum 20 genres"
|
|
8945
|
+
}),
|
|
8946
|
+
categories: array(EventCategoryEnum).max(10, "Cannot filter by more than 10 categories").optional().meta({
|
|
8947
|
+
examples: [["Day Party", "Open Air"]],
|
|
8948
|
+
description: "Filter events by category(s). Returns events matching ANY of the provided categories (OR logic). Maximum 10 categories"
|
|
8949
|
+
}),
|
|
8950
|
+
featured: boolean$1().optional().meta({
|
|
8951
|
+
examples: [true],
|
|
8952
|
+
description: "Filter to only featured (editorial pick) events"
|
|
8953
|
+
}),
|
|
8954
|
+
order: EventOrderEnum.optional().meta({
|
|
8955
|
+
examples: ["date"],
|
|
8956
|
+
description: "Sort order for results. date=by event start date (default), popularity=by interest count, recent=by creation date"
|
|
8303
8957
|
})
|
|
8304
|
-
}).meta({ description: "List events with filtering, full‑text search, geo queries, date range filtering, and cursor-based pagination" });
|
|
8958
|
+
}).meta({ description: "List events with filtering, full‑text search, geo queries, date range filtering, genre/category filtering, and cursor-based pagination" });
|
|
8305
8959
|
const EventListSchema = EventListBaseSchema;
|
|
8306
8960
|
|
|
8307
8961
|
//#endregion
|
|
8308
8962
|
//#region ../contract/src/event/event-page.schema.ts
|
|
8309
|
-
const EventWithInventorySchema = EventSchema.extend({
|
|
8963
|
+
const EventWithInventorySchema = EventSchema.extend({
|
|
8964
|
+
inventory: EventInventorySchema.optional(),
|
|
8965
|
+
liked: boolean$1().optional().meta({
|
|
8966
|
+
description: "Whether the current user has liked this event",
|
|
8967
|
+
examples: [true, false]
|
|
8968
|
+
})
|
|
8969
|
+
});
|
|
8310
8970
|
const EventPageSchema = createPaginatedSchema(EventWithInventorySchema, "events");
|
|
8311
8971
|
|
|
8312
8972
|
//#endregion
|
|
@@ -8321,13 +8981,15 @@ const EventUpdateSchema = EventSchema.omit({
|
|
|
8321
8981
|
promoterId: true,
|
|
8322
8982
|
geohash: true,
|
|
8323
8983
|
status: true,
|
|
8324
|
-
location: true
|
|
8984
|
+
location: true,
|
|
8985
|
+
featured: true,
|
|
8986
|
+
likes: true
|
|
8325
8987
|
}).partial().extend({
|
|
8326
8988
|
key: string$1().meta({
|
|
8327
8989
|
examples: [Examples.Event.id, Examples.Event.slug],
|
|
8328
8990
|
description: "Event key - either a unique ID (evt_xxx format) or URL-friendly slug"
|
|
8329
8991
|
}),
|
|
8330
|
-
|
|
8992
|
+
passcode: string$1().nullable().optional().meta({ description: "Passcode for protected access. Pass null to clear; omit to leave unchanged." }),
|
|
8331
8993
|
url: url().nullable().optional().meta({
|
|
8332
8994
|
examples: ["https://example.com/events/summer-festival-2025"],
|
|
8333
8995
|
description: "External event URL. Pass null to clear; omit to leave unchanged."
|
|
@@ -8339,6 +9001,18 @@ const EventUpdateSchema = EventSchema.omit({
|
|
|
8339
9001
|
googlePlaceId: string$1().optional().meta({
|
|
8340
9002
|
examples: ["ChIJN1t_tDeuEmsRUsoyG83frY4"],
|
|
8341
9003
|
description: "Google Place ID to update location from. Either locationId or googlePlaceId can be provided."
|
|
9004
|
+
}),
|
|
9005
|
+
genres: EventGenresSchema.optional().meta({
|
|
9006
|
+
description: "Music genres for the event (1-5 genres)",
|
|
9007
|
+
examples: [["Tech House", "Melodic Techno"]]
|
|
9008
|
+
}),
|
|
9009
|
+
categories: EventCategoriesSchema.meta({
|
|
9010
|
+
description: "Event characteristics like vibe, venue type, and amenities (up to 10)",
|
|
9011
|
+
examples: [[
|
|
9012
|
+
"Day Party",
|
|
9013
|
+
"Open Air",
|
|
9014
|
+
"Free Entry"
|
|
9015
|
+
]]
|
|
8342
9016
|
})
|
|
8343
9017
|
}).meta({ description: "Schema for updating an existing event." });
|
|
8344
9018
|
|
|
@@ -8431,64 +9105,6 @@ const EventCollaboratorListSchema = object({
|
|
|
8431
9105
|
//#region ../contract/src/event-collaborator/event-collaborator-page.schema.ts
|
|
8432
9106
|
const EventCollaboratorPageSchema = createPaginatedSchema(EventCollaboratorSchema, "grants");
|
|
8433
9107
|
|
|
8434
|
-
//#endregion
|
|
8435
|
-
//#region ../contract/src/internal/place-query-autocomplete-prediction.schema.ts
|
|
8436
|
-
const PlaceQueryAutocompletePredictionSchema = object({
|
|
8437
|
-
description: string$1(),
|
|
8438
|
-
terms: array(object({
|
|
8439
|
-
value: string$1(),
|
|
8440
|
-
offset: number$1()
|
|
8441
|
-
})),
|
|
8442
|
-
matchedSubstrings: array(object({
|
|
8443
|
-
offset: number$1(),
|
|
8444
|
-
length: number$1()
|
|
8445
|
-
})),
|
|
8446
|
-
structuredFormatting: object({
|
|
8447
|
-
mainText: string$1(),
|
|
8448
|
-
mainTextMatchedSubstrings: array(object({
|
|
8449
|
-
offset: number$1(),
|
|
8450
|
-
length: number$1()
|
|
8451
|
-
})).optional(),
|
|
8452
|
-
secondaryText: string$1().optional(),
|
|
8453
|
-
secondaryTextMatchedSubstrings: array(object({
|
|
8454
|
-
offset: number$1(),
|
|
8455
|
-
length: number$1()
|
|
8456
|
-
})).optional()
|
|
8457
|
-
}).optional(),
|
|
8458
|
-
placeId: string$1().optional(),
|
|
8459
|
-
types: array(string$1()).optional()
|
|
8460
|
-
});
|
|
8461
|
-
|
|
8462
|
-
//#endregion
|
|
8463
|
-
//#region ../contract/src/internal/internal.schema.ts
|
|
8464
|
-
/**
|
|
8465
|
-
* Internal DTOs
|
|
8466
|
-
* Data transfer objects for internal service operations
|
|
8467
|
-
*/
|
|
8468
|
-
/**
|
|
8469
|
-
* Place autocomplete response schema
|
|
8470
|
-
*/
|
|
8471
|
-
const PlaceAutocompleteResponseSchema = object({ predictions: array(PlaceQueryAutocompletePredictionSchema) });
|
|
8472
|
-
/**
|
|
8473
|
-
* Place details response schema
|
|
8474
|
-
* Using z.any() as the response structure varies
|
|
8475
|
-
*/
|
|
8476
|
-
const PlaceDetailsResponseSchema = any();
|
|
8477
|
-
|
|
8478
|
-
//#endregion
|
|
8479
|
-
//#region ../contract/src/internal/place-autocomplete.schema.ts
|
|
8480
|
-
const PlaceAutocompleteSchema = object({
|
|
8481
|
-
query: string$1().meta({ description: "Search text to autocomplete" }),
|
|
8482
|
-
country: string$1().optional().meta({ description: "Optional country code for restricting results" })
|
|
8483
|
-
});
|
|
8484
|
-
|
|
8485
|
-
//#endregion
|
|
8486
|
-
//#region ../contract/src/internal/place-details.schema.ts
|
|
8487
|
-
const PlaceDetailsSchema = object({ placeId: string$1().meta({
|
|
8488
|
-
examples: ["ChIJP3Sa8ziYEmsRUKgyFmh9AQM"],
|
|
8489
|
-
description: "Unique identifier for a place from Google Places API. Used to retrieve detailed information including timezone data. This ID is obtained from the autocomplete endpoint and is required to fetch comprehensive place details."
|
|
8490
|
-
}) });
|
|
8491
|
-
|
|
8492
9108
|
//#endregion
|
|
8493
9109
|
//#region ../contract/src/internal/upload-image.schema.ts
|
|
8494
9110
|
const ALLOWED_FOLDERS = [
|
|
@@ -8527,6 +9143,10 @@ const LocationListSchema = object({
|
|
|
8527
9143
|
longitude: number().min(-180).max(180).optional().meta({
|
|
8528
9144
|
examples: [Examples.Location.longitude],
|
|
8529
9145
|
description: "User's longitude for proximity-based results (optional for better relevance)"
|
|
9146
|
+
}),
|
|
9147
|
+
types: array(string$1()).optional().meta({
|
|
9148
|
+
examples: [["establishment"]],
|
|
9149
|
+
description: "Filter results by Google Place types (e.g., 'establishment', 'night_club', 'bar')"
|
|
8530
9150
|
})
|
|
8531
9151
|
}).meta({ description: "Parameters for searching locations" });
|
|
8532
9152
|
|
|
@@ -8599,6 +9219,10 @@ const OrderCustomerSchema = object({
|
|
|
8599
9219
|
phone: string$1().meta({
|
|
8600
9220
|
examples: [Examples.Customer.phone],
|
|
8601
9221
|
description: "Phone number of the customer"
|
|
9222
|
+
}).optional(),
|
|
9223
|
+
airwallexId: string$1().meta({
|
|
9224
|
+
examples: ["cus_hkdmrhkh8he4j3kvela"],
|
|
9225
|
+
description: "Airwallex customer identifier for saved payment methods functionality"
|
|
8602
9226
|
}).optional()
|
|
8603
9227
|
});
|
|
8604
9228
|
|
|
@@ -10275,9 +10899,29 @@ const OrderPaymentSchema = object({
|
|
|
10275
10899
|
examples: ["pi_1234567890abcdef"],
|
|
10276
10900
|
description: "Stripe payment intent identifier when using Stripe gateway"
|
|
10277
10901
|
}),
|
|
10902
|
+
stripeClientSecret: string$1().optional().meta({
|
|
10903
|
+
examples: ["pi_1234567890abcdef_secret_xyz"],
|
|
10904
|
+
description: "Stripe PaymentIntent client secret associated with the order, used to complete the payment flow"
|
|
10905
|
+
}),
|
|
10906
|
+
stripeAccountId: string$1().optional().meta({
|
|
10907
|
+
examples: ["acct_1234567890abcdef"],
|
|
10908
|
+
description: "Connected Stripe account ID for direct charges. When present, payment is processed directly on the connected account rather than the platform account."
|
|
10909
|
+
}),
|
|
10278
10910
|
airwallexId: string$1().optional().meta({
|
|
10279
10911
|
examples: ["int_hkdmr7v9rg1j8donpkmv96"],
|
|
10280
10912
|
description: "Airwallex payment intent identifier when using Airwallex gateway"
|
|
10913
|
+
}),
|
|
10914
|
+
airwallexClientSecret: string$1().optional().meta({
|
|
10915
|
+
examples: ["eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE3MDAwMDAwMDAsImV4cCI6MTcwMDAwMzYwMCwiaW50ZW50X2lkIjoiaW50X2hrZG1yN3Y5cmcxajhkb25wa212OTYifQ.K8vLx2nPzQHdR5mT1wYcBfJkLmNpS3xG7aE9dH4qZvM"],
|
|
10916
|
+
description: "Airwallex client secret used to authenticate requests for payment initialization"
|
|
10917
|
+
}),
|
|
10918
|
+
airwallexCustomerId: string$1().optional().meta({
|
|
10919
|
+
examples: ["cus_hkdmrhkh8he4j3kvela"],
|
|
10920
|
+
description: "Airwallex customer ID attached to the PaymentIntent for saved cards functionality"
|
|
10921
|
+
}),
|
|
10922
|
+
airwallexCustomerClientSecret: string$1().optional().meta({
|
|
10923
|
+
examples: ["eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE3MDAwMDAwMDAsImV4cCI6MTcwMDAwMzYwMCwiY3VzdG9tZXJfaWQiOiJjdXNfaGtkbXJoa2g4aGU0ajNrdmVsYSJ9.abc123"],
|
|
10924
|
+
description: "Airwallex customer client secret for accessing saved payment methods in the Drop-in Element"
|
|
10281
10925
|
})
|
|
10282
10926
|
});
|
|
10283
10927
|
|
|
@@ -10330,6 +10974,115 @@ const OrderPriceSchema = object({
|
|
|
10330
10974
|
})
|
|
10331
10975
|
});
|
|
10332
10976
|
|
|
10977
|
+
//#endregion
|
|
10978
|
+
//#region ../contract/src/order/order-refund.schema.ts
|
|
10979
|
+
const OrderRefundStatusEnum = _enum([
|
|
10980
|
+
"PENDING",
|
|
10981
|
+
"PROCESSING",
|
|
10982
|
+
"SUCCEEDED",
|
|
10983
|
+
"FAILED"
|
|
10984
|
+
]);
|
|
10985
|
+
const OrderRefundReasonEnum = _enum([
|
|
10986
|
+
"CUSTOMER_REQUEST",
|
|
10987
|
+
"DUPLICATE",
|
|
10988
|
+
"EVENT_CANCELLED",
|
|
10989
|
+
"OTHER"
|
|
10990
|
+
]);
|
|
10991
|
+
const OrderRefundInitiatedByEnum = _enum(["USER", "GATEWAY"]);
|
|
10992
|
+
const OrderRefundItemSchema = object({
|
|
10993
|
+
orderItemId: string$1().meta({
|
|
10994
|
+
examples: [Examples.OrderRefundItem.orderItemId],
|
|
10995
|
+
description: "Identifier of the order item being refunded"
|
|
10996
|
+
}),
|
|
10997
|
+
quantity: int().min(1).meta({
|
|
10998
|
+
examples: [Examples.OrderRefundItem.quantity],
|
|
10999
|
+
description: "Number of units refunded for this item"
|
|
11000
|
+
}),
|
|
11001
|
+
amount: int().min(0).meta({
|
|
11002
|
+
examples: [Examples.OrderRefundItem.amount],
|
|
11003
|
+
description: "Refund amount for this item in cents (base price only, excludes booking fee)"
|
|
11004
|
+
}),
|
|
11005
|
+
ticketIds: array(string$1()).meta({
|
|
11006
|
+
examples: [Examples.OrderRefundItem.ticketIds],
|
|
11007
|
+
description: "Specific ticket identifiers that were refunded (selected via FIFO)"
|
|
11008
|
+
})
|
|
11009
|
+
});
|
|
11010
|
+
const OrderRefundSchema = object({
|
|
11011
|
+
id: string$1().meta({
|
|
11012
|
+
examples: [Examples.OrderRefund.id],
|
|
11013
|
+
description: "Unique identifier for this refund"
|
|
11014
|
+
}),
|
|
11015
|
+
idempotencyKey: string$1().optional().meta({
|
|
11016
|
+
examples: [Examples.OrderRefund.idempotencyKey],
|
|
11017
|
+
description: "Client-provided key to prevent duplicate refund processing"
|
|
11018
|
+
}),
|
|
11019
|
+
status: OrderRefundStatusEnum.meta({
|
|
11020
|
+
examples: ["PENDING", "SUCCEEDED"],
|
|
11021
|
+
description: "Current processing status. PENDING: awaiting gateway confirmation or async processing (e.g., bank transfers). PROCESSING: gateway confirmed, ticket cancellation in progress. SUCCEEDED/FAILED: terminal states."
|
|
11022
|
+
}),
|
|
11023
|
+
processedAt: datetime().optional().meta({
|
|
11024
|
+
examples: [Examples.OrderRefund.processedAt],
|
|
11025
|
+
description: "Timestamp when the payment gateway confirmed the refund"
|
|
11026
|
+
}),
|
|
11027
|
+
failureReason: string$1().optional().meta({
|
|
11028
|
+
examples: ["Insufficient funds for refund"],
|
|
11029
|
+
description: "Error message from payment gateway if refund failed"
|
|
11030
|
+
}),
|
|
11031
|
+
amount: int().min(1).meta({
|
|
11032
|
+
examples: [Examples.OrderRefund.amount],
|
|
11033
|
+
description: "Total refund amount in cents (excludes booking fee, includes shipping if applicable)"
|
|
11034
|
+
}),
|
|
11035
|
+
shippingRefunded: int().min(0).meta({
|
|
11036
|
+
examples: [Examples.OrderRefund.shippingRefunded],
|
|
11037
|
+
description: "Shipping portion of the refund in cents"
|
|
11038
|
+
}),
|
|
11039
|
+
reason: OrderRefundReasonEnum.meta({
|
|
11040
|
+
examples: [
|
|
11041
|
+
"CUSTOMER_REQUEST",
|
|
11042
|
+
"DUPLICATE",
|
|
11043
|
+
"EVENT_CANCELLED"
|
|
11044
|
+
],
|
|
11045
|
+
description: "Categorized reason for the refund used for analytics"
|
|
11046
|
+
}),
|
|
11047
|
+
note: string$1().optional().meta({
|
|
11048
|
+
examples: [Examples.OrderRefund.note],
|
|
11049
|
+
description: "Free-form notes explaining the refund"
|
|
11050
|
+
}),
|
|
11051
|
+
items: array(OrderRefundItemSchema).meta({ description: "Line items included in this refund with quantities and amounts" }),
|
|
11052
|
+
ticketsCancelled: boolean$1().meta({
|
|
11053
|
+
examples: [Examples.OrderRefund.ticketsCancelled],
|
|
11054
|
+
description: "Whether tickets were cancelled as part of this refund"
|
|
11055
|
+
}),
|
|
11056
|
+
ticketsCancelledCount: int().optional().meta({
|
|
11057
|
+
examples: [Examples.OrderRefund.ticketsCancelledCount],
|
|
11058
|
+
description: "Number of tickets that were cancelled"
|
|
11059
|
+
}),
|
|
11060
|
+
gateway: PaymentMethodEnum.meta({
|
|
11061
|
+
examples: ["STRIPE", "AIRWALLEX"],
|
|
11062
|
+
description: "Payment gateway used to process the refund"
|
|
11063
|
+
}),
|
|
11064
|
+
gatewayRefundId: string$1().optional().meta({
|
|
11065
|
+
examples: [Examples.OrderRefund.gatewayRefundId],
|
|
11066
|
+
description: "Refund identifier from the payment gateway"
|
|
11067
|
+
}),
|
|
11068
|
+
initiatedBy: OrderRefundInitiatedByEnum.meta({
|
|
11069
|
+
examples: ["USER", "GATEWAY"],
|
|
11070
|
+
description: "Whether refund was initiated by a user or directly through the payment gateway"
|
|
11071
|
+
}),
|
|
11072
|
+
userId: string$1().optional().meta({
|
|
11073
|
+
examples: [Examples.OrderRefund.userId],
|
|
11074
|
+
description: "Identifier of the user who initiated the refund (when initiatedBy is USER)"
|
|
11075
|
+
}),
|
|
11076
|
+
metadata: record(string$1(), string$1()).optional().meta({
|
|
11077
|
+
examples: [{ supportTicket: "#12345" }],
|
|
11078
|
+
description: "Custom key-value pairs passed through to the payment gateway"
|
|
11079
|
+
}),
|
|
11080
|
+
createdAt: datetime().meta({
|
|
11081
|
+
examples: [Examples.OrderRefund.createdAt],
|
|
11082
|
+
description: "Timestamp when the refund was created"
|
|
11083
|
+
})
|
|
11084
|
+
});
|
|
11085
|
+
|
|
10333
11086
|
//#endregion
|
|
10334
11087
|
//#region ../contract/src/order/order-timeline.schema.ts
|
|
10335
11088
|
const OrderTimelineKindEnum = _enum([
|
|
@@ -10411,7 +11164,6 @@ const OrderStatusEnum = _enum([
|
|
|
10411
11164
|
"PENDING",
|
|
10412
11165
|
"PROCESSING",
|
|
10413
11166
|
"SUCCESSFUL",
|
|
10414
|
-
"REFUNDED",
|
|
10415
11167
|
"DISPUTED",
|
|
10416
11168
|
"ABANDONED"
|
|
10417
11169
|
]);
|
|
@@ -10443,6 +11195,7 @@ const OrderSchema = object({
|
|
|
10443
11195
|
couponCode: OrderCouponCodeSchema.optional().meta({ description: "Details of the coupon code applied to this order for discount calculation" }),
|
|
10444
11196
|
customer: OrderCustomerSchema.optional().meta({ description: "Details of the customer who placed this order, if available." }),
|
|
10445
11197
|
timeline: array(OrderTimelineSchema).optional().meta({ description: "Chronological audit trail entries associated with this order." }),
|
|
11198
|
+
refunds: array(OrderRefundSchema).default([]).meta({ description: "Refunds processed for this order. Includes pending, succeeded, and failed refunds." }),
|
|
10446
11199
|
customerId: CustomerIdSchema.optional().meta({
|
|
10447
11200
|
examples: [Examples.Customer.id],
|
|
10448
11201
|
description: "Identifier of the customer who placed this order."
|
|
@@ -10517,7 +11270,6 @@ const OrderListSchema = object({
|
|
|
10517
11270
|
"PENDING",
|
|
10518
11271
|
"PROCESSING",
|
|
10519
11272
|
"SUCCESSFUL",
|
|
10520
|
-
"REFUNDED",
|
|
10521
11273
|
"DISPUTED",
|
|
10522
11274
|
"ABANDONED"
|
|
10523
11275
|
]).optional().meta({
|
|
@@ -10764,6 +11516,63 @@ const OrderQuoteCreateSchema = object({
|
|
|
10764
11516
|
//#region ../contract/src/order/order-quote-response.schema.ts
|
|
10765
11517
|
const OrderQuoteResponseSchema = object({ quote: OrderQuoteSchema });
|
|
10766
11518
|
|
|
11519
|
+
//#endregion
|
|
11520
|
+
//#region ../contract/src/order/order-refund-create.schema.ts
|
|
11521
|
+
const OrderRefundCreateItemSchema = object({
|
|
11522
|
+
orderItemId: string$1().meta({
|
|
11523
|
+
examples: [Examples.OrderRefundItem.orderItemId],
|
|
11524
|
+
description: "Identifier of the order item to refund"
|
|
11525
|
+
}),
|
|
11526
|
+
quantity: int().min(1).meta({
|
|
11527
|
+
examples: [Examples.OrderRefundItem.quantity],
|
|
11528
|
+
description: "Number of units to refund for this item"
|
|
11529
|
+
})
|
|
11530
|
+
});
|
|
11531
|
+
const OrderRefundCreateSchema = object({
|
|
11532
|
+
id: OrderIdSchema.meta({
|
|
11533
|
+
examples: [Examples.Order.id],
|
|
11534
|
+
description: "Identifier of the order to refund"
|
|
11535
|
+
}),
|
|
11536
|
+
fullRefund: boolean$1().default(false).meta({
|
|
11537
|
+
examples: [false],
|
|
11538
|
+
description: "When true, refunds all remaining refundable items. Mutually exclusive with items."
|
|
11539
|
+
}),
|
|
11540
|
+
items: array(OrderRefundCreateItemSchema).optional().meta({ description: "Specific items and quantities to refund. Required if fullRefund is false." }),
|
|
11541
|
+
shippingAmount: int().min(0).optional().meta({
|
|
11542
|
+
examples: [500],
|
|
11543
|
+
description: "Amount of shipping to refund in cents. Cannot exceed remaining refundable shipping."
|
|
11544
|
+
}),
|
|
11545
|
+
cancelTickets: boolean$1().default(true).meta({
|
|
11546
|
+
examples: [true],
|
|
11547
|
+
description: "Whether to cancel tickets associated with refunded items. Defaults to true."
|
|
11548
|
+
}),
|
|
11549
|
+
notify: boolean$1().default(true).meta({
|
|
11550
|
+
examples: [true],
|
|
11551
|
+
description: "Whether to send a refund confirmation email to the customer. Defaults to true."
|
|
11552
|
+
}),
|
|
11553
|
+
reason: OrderRefundReasonEnum.meta({
|
|
11554
|
+
examples: [
|
|
11555
|
+
"CUSTOMER_REQUEST",
|
|
11556
|
+
"DUPLICATE",
|
|
11557
|
+
"EVENT_CANCELLED"
|
|
11558
|
+
],
|
|
11559
|
+
description: "Categorized reason for the refund"
|
|
11560
|
+
}),
|
|
11561
|
+
note: string$1().optional().meta({
|
|
11562
|
+
examples: ["Customer requested refund due to schedule conflict"],
|
|
11563
|
+
description: "Free-form notes explaining the refund"
|
|
11564
|
+
}),
|
|
11565
|
+
idempotencyKey: string$1().optional().meta({
|
|
11566
|
+
examples: ["refund_12345_customer_request"],
|
|
11567
|
+
description: "Client-provided key to prevent duplicate refund processing. Recommended for programmatic refunds."
|
|
11568
|
+
}),
|
|
11569
|
+
metadata: record(string$1(), string$1()).optional().meta({
|
|
11570
|
+
examples: [{ supportTicket: "#12345" }],
|
|
11571
|
+
description: "Custom key-value pairs passed through to the payment gateway"
|
|
11572
|
+
})
|
|
11573
|
+
}).refine((data) => data.fullRefund || data.items && data.items.length > 0, { message: "Either fullRefund must be true or items must be provided" });
|
|
11574
|
+
const OrderRefundResponseSchema = object({ refund: OrderRefundSchema });
|
|
11575
|
+
|
|
10767
11576
|
//#endregion
|
|
10768
11577
|
//#region ../contract/src/order/order-resend.schema.ts
|
|
10769
11578
|
const OrderResendSchema = object({
|
|
@@ -10855,7 +11664,7 @@ const OrderUpdateNoteSchema = object({
|
|
|
10855
11664
|
|
|
10856
11665
|
//#endregion
|
|
10857
11666
|
//#region ../contract/src/payout/approval-result.schema.ts
|
|
10858
|
-
|
|
11667
|
+
object({
|
|
10859
11668
|
success: boolean$1().meta({ description: "Whether the payout approval was successful" }),
|
|
10860
11669
|
message: string$1().optional().meta({ description: "Optional message about the approval result" }),
|
|
10861
11670
|
payoutId: string$1().meta({ description: "ID of the payout that was approved" })
|
|
@@ -10989,6 +11798,61 @@ const PayoutPriceSchema = object({
|
|
|
10989
11798
|
})
|
|
10990
11799
|
});
|
|
10991
11800
|
|
|
11801
|
+
//#endregion
|
|
11802
|
+
//#region ../contract/src/payout/payout-timeline.schema.ts
|
|
11803
|
+
const PayoutTimelineKindEnum = _enum([
|
|
11804
|
+
"CREATED",
|
|
11805
|
+
"APPROVED",
|
|
11806
|
+
"REJECTED",
|
|
11807
|
+
"PROCESSING",
|
|
11808
|
+
"PAID",
|
|
11809
|
+
"FAILED",
|
|
11810
|
+
"CANCELLED",
|
|
11811
|
+
"NOTE"
|
|
11812
|
+
]);
|
|
11813
|
+
const PayoutTimelineSchema = object({
|
|
11814
|
+
id: string$1().meta({
|
|
11815
|
+
examples: ["tl_01jgxyz123abc"],
|
|
11816
|
+
description: "Unique identifier for this timeline entry"
|
|
11817
|
+
}),
|
|
11818
|
+
createdAt: datetime().readonly().meta({
|
|
11819
|
+
examples: [Examples.Payout.createdAt],
|
|
11820
|
+
description: "Timestamp in ISO 8601 format when this timeline entry was created"
|
|
11821
|
+
}),
|
|
11822
|
+
kind: PayoutTimelineKindEnum.meta({
|
|
11823
|
+
examples: [
|
|
11824
|
+
"CREATED",
|
|
11825
|
+
"APPROVED",
|
|
11826
|
+
"PAID"
|
|
11827
|
+
],
|
|
11828
|
+
description: "Type of timeline event (CREATED, APPROVED, PROCESSING, PAID, NOTE, etc.)"
|
|
11829
|
+
}),
|
|
11830
|
+
editable: boolean$1().meta({
|
|
11831
|
+
examples: [false],
|
|
11832
|
+
description: "Whether this timeline entry can be edited by users"
|
|
11833
|
+
}),
|
|
11834
|
+
pinned: boolean$1().meta({
|
|
11835
|
+
examples: [false],
|
|
11836
|
+
description: "Whether this timeline entry is pinned to the top of the timeline"
|
|
11837
|
+
}),
|
|
11838
|
+
description: string$1().meta({
|
|
11839
|
+
examples: ["Payout was created after event settlement"],
|
|
11840
|
+
description: "Human-readable description of what happened in this timeline event"
|
|
11841
|
+
}),
|
|
11842
|
+
author: string$1().meta({
|
|
11843
|
+
examples: ["System"],
|
|
11844
|
+
description: "Name of the user or system that created this timeline entry"
|
|
11845
|
+
}),
|
|
11846
|
+
userId: string$1().optional().meta({
|
|
11847
|
+
examples: [Examples.User.id],
|
|
11848
|
+
description: "Identifier of the user who created this timeline entry, when available"
|
|
11849
|
+
}),
|
|
11850
|
+
externalId: string$1().optional().meta({
|
|
11851
|
+
examples: ["airwallex:transfer_abc123:completed"],
|
|
11852
|
+
description: "External idempotency key for deduplication (e.g., Airwallex transfer events)"
|
|
11853
|
+
})
|
|
11854
|
+
});
|
|
11855
|
+
|
|
10992
11856
|
//#endregion
|
|
10993
11857
|
//#region ../contract/src/payout/payout-transfer.schema.ts
|
|
10994
11858
|
const PayoutTransferSchema = object({
|
|
@@ -11004,12 +11868,12 @@ const PayoutTransferSchema = object({
|
|
|
11004
11868
|
"TICKETS",
|
|
11005
11869
|
"TENANT",
|
|
11006
11870
|
"VENUE",
|
|
11007
|
-
"
|
|
11871
|
+
"TEAM",
|
|
11008
11872
|
"SESSIONS",
|
|
11009
11873
|
"UNKNOWN"
|
|
11010
11874
|
]).meta({
|
|
11011
11875
|
examples: ["TICKETS"],
|
|
11012
|
-
description: "Type of transfer. TICKETS: revenue from ticket sales, TENANT: platform fees, VENUE: venue split,
|
|
11876
|
+
description: "Type of transfer. TICKETS: revenue from ticket sales, TENANT: platform fees, VENUE: venue split, TEAM: team split, SESSIONS: platform commission, UNKNOWN: unclassified transfer."
|
|
11013
11877
|
}),
|
|
11014
11878
|
amount: int().min(0).meta({
|
|
11015
11879
|
examples: [Examples.PayoutTransfer.amount],
|
|
@@ -11055,7 +11919,7 @@ const PayoutTransferSchema = object({
|
|
|
11055
11919
|
//#region ../contract/src/payout/payout.schema.ts
|
|
11056
11920
|
const PayoutStatusEnum = _enum([
|
|
11057
11921
|
"UPCOMING",
|
|
11058
|
-
"
|
|
11922
|
+
"FAILED",
|
|
11059
11923
|
"PROCESSING",
|
|
11060
11924
|
"PAID",
|
|
11061
11925
|
"CANCELLED"
|
|
@@ -11111,6 +11975,7 @@ const PayoutSchema = object({
|
|
|
11111
11975
|
deductions: array(PayoutDeductionSchema).meta({ description: "List of deductions applied before calculating the payout total." }),
|
|
11112
11976
|
price: PayoutPriceSchema.meta({ description: "Summary of amounts for transfers and deductions in this payout." }),
|
|
11113
11977
|
event: PayoutEventSchema.meta({ description: "Information about the event associated with this payout." }),
|
|
11978
|
+
timeline: array(PayoutTimelineSchema).optional().meta({ description: "Chronological list of status changes and notes for this payout." }),
|
|
11114
11979
|
eventId: string$1().meta({
|
|
11115
11980
|
examples: [Examples.Payout.eventId],
|
|
11116
11981
|
description: "Identifier of the event for which this payout was generated."
|
|
@@ -11120,7 +11985,7 @@ const PayoutSchema = object({
|
|
|
11120
11985
|
|
|
11121
11986
|
//#endregion
|
|
11122
11987
|
//#region ../contract/src/payout/payout-actions.schema.ts
|
|
11123
|
-
|
|
11988
|
+
object({ id: string$1().meta({
|
|
11124
11989
|
examples: [Examples.Payout.id],
|
|
11125
11990
|
description: "Unique identifier of the payout to approve for processing."
|
|
11126
11991
|
}) });
|
|
@@ -11143,6 +12008,19 @@ object({ id: string$1().meta({
|
|
|
11143
12008
|
description: "Unique identifier of the payout to retry transfer processing for."
|
|
11144
12009
|
}) });
|
|
11145
12010
|
|
|
12011
|
+
//#endregion
|
|
12012
|
+
//#region ../contract/src/payout/payout-add-note.schema.ts
|
|
12013
|
+
const PayoutAddNoteSchema = object({
|
|
12014
|
+
id: string$1().meta({
|
|
12015
|
+
examples: [Examples.Payout.id],
|
|
12016
|
+
description: "Unique identifier of the payout to add a note to"
|
|
12017
|
+
}),
|
|
12018
|
+
note: string$1().trim().min(1).max(1e3).meta({
|
|
12019
|
+
examples: ["Transfer confirmed via bank statement"],
|
|
12020
|
+
description: "Note text content (1-1000 characters)"
|
|
12021
|
+
})
|
|
12022
|
+
});
|
|
12023
|
+
|
|
11146
12024
|
//#endregion
|
|
11147
12025
|
//#region ../utils/src/fees.ts
|
|
11148
12026
|
const FeeStructureModel = object({
|
|
@@ -11161,7 +12039,7 @@ const FeeStructureModel = object({
|
|
|
11161
12039
|
percent: number$1().optional(),
|
|
11162
12040
|
split: object({
|
|
11163
12041
|
tenant: number$1(),
|
|
11164
|
-
|
|
12042
|
+
team: number$1(),
|
|
11165
12043
|
venue: number$1(),
|
|
11166
12044
|
sessions: number$1()
|
|
11167
12045
|
})
|
|
@@ -11178,9 +12056,9 @@ const PayoutSplitSchema = object({
|
|
|
11178
12056
|
examples: [25e3],
|
|
11179
12057
|
description: "Amount allocated to the venue in cents. This represents the venue's share of the revenue from events held at their location."
|
|
11180
12058
|
}),
|
|
11181
|
-
|
|
12059
|
+
team: number$1().meta({
|
|
11182
12060
|
examples: [2e4],
|
|
11183
|
-
description: "Amount allocated to the
|
|
12061
|
+
description: "Amount allocated to the team in cents. This represents the team's share of the revenue after fees and other deductions."
|
|
11184
12062
|
}),
|
|
11185
12063
|
sessions: number$1().meta({
|
|
11186
12064
|
examples: [3e3],
|
|
@@ -11260,13 +12138,13 @@ const PayoutListSchema = object({
|
|
|
11260
12138
|
}),
|
|
11261
12139
|
status: _enum([
|
|
11262
12140
|
"UPCOMING",
|
|
11263
|
-
"
|
|
12141
|
+
"FAILED",
|
|
11264
12142
|
"PROCESSING",
|
|
11265
12143
|
"PAID",
|
|
11266
12144
|
"CANCELLED"
|
|
11267
12145
|
]).optional().meta({
|
|
11268
12146
|
examples: ["PAID"],
|
|
11269
|
-
description: "Filter payouts by payment status. UPCOMING: scheduled but not yet processed,
|
|
12147
|
+
description: "Filter payouts by payment status. UPCOMING: scheduled but not yet processed, FAILED: failed processing and will retry, PROCESSING: currently being processed, PAID: successfully completed, CANCELLED: cancelled before completion."
|
|
11270
12148
|
}),
|
|
11271
12149
|
approval: ApprovalStatusEnum.optional().meta({
|
|
11272
12150
|
examples: ["APPROVED"],
|
|
@@ -11333,6 +12211,19 @@ PayoutSchema.pick({
|
|
|
11333
12211
|
})
|
|
11334
12212
|
});
|
|
11335
12213
|
|
|
12214
|
+
//#endregion
|
|
12215
|
+
//#region ../contract/src/payout/payout-delete-note.schema.ts
|
|
12216
|
+
const PayoutDeleteNoteSchema = object({
|
|
12217
|
+
id: string$1().meta({
|
|
12218
|
+
examples: [Examples.Payout.id],
|
|
12219
|
+
description: "Unique identifier of the payout"
|
|
12220
|
+
}),
|
|
12221
|
+
noteId: string$1().meta({
|
|
12222
|
+
examples: ["tl_1234567890_abc123"],
|
|
12223
|
+
description: "Unique identifier of the timeline note to delete"
|
|
12224
|
+
})
|
|
12225
|
+
});
|
|
12226
|
+
|
|
11336
12227
|
//#endregion
|
|
11337
12228
|
//#region ../contract/src/payout/payout-get.schema.ts
|
|
11338
12229
|
const PayoutGetSchema = PayoutSchema.pick({ id: true }).extend({ id: string$1().meta({
|
|
@@ -11408,32 +12299,38 @@ const PayoutStatsGetSchema = object({
|
|
|
11408
12299
|
|
|
11409
12300
|
//#endregion
|
|
11410
12301
|
//#region ../contract/src/payout/payout-update.schema.ts
|
|
11411
|
-
PayoutSchema.pick({ id: true }).merge(PayoutSchema.pick({
|
|
12302
|
+
const PayoutUpdateSchema = PayoutSchema.pick({ id: true }).merge(PayoutSchema.pick({
|
|
11412
12303
|
status: true,
|
|
11413
|
-
approval: true
|
|
11414
|
-
paidAt: true
|
|
12304
|
+
approval: true
|
|
11415
12305
|
}).partial()).extend({
|
|
11416
12306
|
id: string$1().meta({
|
|
11417
12307
|
examples: [Examples.Payout.id],
|
|
11418
12308
|
description: "Unique identifier of the payout to update."
|
|
11419
12309
|
}),
|
|
11420
|
-
status: _enum([
|
|
11421
|
-
"
|
|
11422
|
-
"
|
|
11423
|
-
"PROCESSING",
|
|
11424
|
-
"PAID",
|
|
11425
|
-
"CANCELLED"
|
|
11426
|
-
]).optional().meta({
|
|
11427
|
-
examples: ["PAID"],
|
|
11428
|
-
description: "Optional new payment status for the payout. UPCOMING: scheduled but not processed, PENDING: awaiting processing, PROCESSING: currently being processed, PAID: successfully completed, CANCELLED: cancelled."
|
|
12310
|
+
status: _enum(["CANCELLED"]).optional().meta({
|
|
12311
|
+
examples: ["CANCELLED"],
|
|
12312
|
+
description: "Optional new payment status for the payout. Only CANCELLED is allowed for manual updates."
|
|
11429
12313
|
}),
|
|
11430
12314
|
approval: ApprovalStatusEnum.optional().meta({
|
|
11431
12315
|
examples: ["APPROVED"],
|
|
11432
12316
|
description: "Optional new approval status for the payout. PENDING: awaiting approval, APPROVED: approved for processing, REJECTED: rejected."
|
|
12317
|
+
})
|
|
12318
|
+
});
|
|
12319
|
+
|
|
12320
|
+
//#endregion
|
|
12321
|
+
//#region ../contract/src/payout/payout-update-note.schema.ts
|
|
12322
|
+
const PayoutUpdateNoteSchema = object({
|
|
12323
|
+
id: string$1().meta({
|
|
12324
|
+
examples: [Examples.Payout.id],
|
|
12325
|
+
description: "Unique identifier of the payout"
|
|
11433
12326
|
}),
|
|
11434
|
-
|
|
11435
|
-
examples: [
|
|
11436
|
-
description: "
|
|
12327
|
+
noteId: string$1().meta({
|
|
12328
|
+
examples: ["tl_1234567890_abc123"],
|
|
12329
|
+
description: "Unique identifier of the timeline note to update"
|
|
12330
|
+
}),
|
|
12331
|
+
note: string$1().trim().min(1).max(1e3).meta({
|
|
12332
|
+
examples: ["Updated: Transfer confirmed - reference #12345"],
|
|
12333
|
+
description: "Updated note text content (1-1000 characters)"
|
|
11437
12334
|
})
|
|
11438
12335
|
});
|
|
11439
12336
|
|
|
@@ -11510,7 +12407,6 @@ const PromoterPayoutFrequencyEnum = _enum([
|
|
|
11510
12407
|
"WEEKLY",
|
|
11511
12408
|
"AFTER_EVENT"
|
|
11512
12409
|
]);
|
|
11513
|
-
const PromoterGatewayEnum = _enum(["AIRWALLEX", "STRIPE"]);
|
|
11514
12410
|
const PromoterSchema = object({
|
|
11515
12411
|
id: PromoterIdSchema.readonly().meta({
|
|
11516
12412
|
examples: [Examples.Promoter.id],
|
|
@@ -11568,16 +12464,8 @@ const PromoterSchema = object({
|
|
|
11568
12464
|
description: "TikTok pixel ID for advertising and conversion tracking"
|
|
11569
12465
|
})
|
|
11570
12466
|
}).optional().meta({ description: "Optional tracking configuration for analytics and advertising platforms" }),
|
|
11571
|
-
gateway: PromoterGatewayEnum.meta({
|
|
11572
|
-
examples: ["AIRWALLEX"],
|
|
11573
|
-
description: "Payment gateway provider used for processing transactions. AIRWALLEX or STRIPE"
|
|
11574
|
-
}).optional(),
|
|
11575
|
-
gatewayId: string$1().meta({
|
|
11576
|
-
examples: ["ben_12345abcde67890"],
|
|
11577
|
-
description: "External identifier in the payment gateway system"
|
|
11578
|
-
}).optional(),
|
|
11579
12467
|
metadata: MetadataSchema
|
|
11580
|
-
}).meta({ description: "Promoter organization with location
|
|
12468
|
+
}).meta({ description: "Promoter organization with location and approval status" });
|
|
11581
12469
|
|
|
11582
12470
|
//#endregion
|
|
11583
12471
|
//#region ../contract/src/promoter/promoter-by-identifier-get.schema.ts
|
|
@@ -11716,9 +12604,7 @@ const PromoterUpdateSchema = PromoterSchema.omit({
|
|
|
11716
12604
|
fbId: string$1().optional(),
|
|
11717
12605
|
gtmId: string$1().optional(),
|
|
11718
12606
|
tikTokId: string$1().optional()
|
|
11719
|
-
}).nullable().optional().meta({ description: "Analytics tracking config. Pass null to clear all tracking; omit to leave unchanged." })
|
|
11720
|
-
gateway: PromoterGatewayEnum.nullable().optional().meta({ description: "Payment gateway. Pass null to clear; omit to leave unchanged." }),
|
|
11721
|
-
gatewayId: string$1().nullable().optional().meta({ description: "Payment gateway ID. Pass null to clear; omit to leave unchanged." })
|
|
12607
|
+
}).nullable().optional().meta({ description: "Analytics tracking config. Pass null to clear all tracking; omit to leave unchanged." })
|
|
11722
12608
|
}).meta({ description: "Schema for updating an existing promoter." });
|
|
11723
12609
|
|
|
11724
12610
|
//#endregion
|
|
@@ -11731,6 +12617,12 @@ const AcceptTeamInviteSchema = object({
|
|
|
11731
12617
|
|
|
11732
12618
|
//#endregion
|
|
11733
12619
|
//#region ../contract/src/team/team.schema.ts
|
|
12620
|
+
const PaymentGatewaySchema = object({
|
|
12621
|
+
provider: _enum(["STRIPE", "AIRWALLEX"]).meta({ description: "Payment gateway provider type" }),
|
|
12622
|
+
connectedAt: datetime().meta({ description: "Timestamp when the payment gateway was connected to this team" }),
|
|
12623
|
+
connectedBy: string$1().meta({ description: "User ID of the team member who connected the payment gateway" }),
|
|
12624
|
+
accountId: string$1().meta({ description: "Connected account ID. For Stripe: acct_xxxxx. For Airwallex: business account open ID." })
|
|
12625
|
+
}).meta({ description: "Payment gateway configuration for direct payouts to the team's connected account" });
|
|
11734
12626
|
const TeamSchema = object({
|
|
11735
12627
|
id: TeamIdSchema.readonly().meta({ description: "Unique identifier for the team organization" }),
|
|
11736
12628
|
createdAt: datetime().readonly().meta({ description: "Timestamp in ISO 8601 format when the team was created" }),
|
|
@@ -11743,7 +12635,8 @@ const TeamSchema = object({
|
|
|
11743
12635
|
approval: ApprovalStatusEnum.meta({ description: "Approval status of the team. PENDING: awaiting review, APPROVED: can create promoters/venues/events, REJECTED: cannot operate" }),
|
|
11744
12636
|
deletedAt: datetime().optional().readonly().meta({ description: "Timestamp in ISO 8601 format when the team was soft deleted. Only present for deleted teams." }),
|
|
11745
12637
|
tenantId: string$1().readonly().meta({ description: "Tenant ID for multi-tenant isolation" }),
|
|
11746
|
-
isAdmin: boolean$1().optional().meta({ description: "Whether this team is the admin team for the tenant" })
|
|
12638
|
+
isAdmin: boolean$1().optional().meta({ description: "Whether this team is the admin team for the tenant" }),
|
|
12639
|
+
gateway: PaymentGatewaySchema.optional().meta({ description: "Connected payment gateway for direct payouts. When connected, funds from ticket sales go directly to the team's account with platform fees deducted." })
|
|
11747
12640
|
}).meta({ description: "Team organization that owns promoters and venues. Multiple brands can exist under one team." });
|
|
11748
12641
|
TeamSchema.extend({ promoter: PromoterSchema.meta({ description: "The primary promoter brand associated with this team" }) }).meta({ description: "Team organization with its primary promoter brand included for convenience" });
|
|
11749
12642
|
|
|
@@ -11948,6 +12841,46 @@ const TeamListSchema = object({
|
|
|
11948
12841
|
//#region ../contract/src/team/team-page.schema.ts
|
|
11949
12842
|
const TeamPageSchema = createPaginatedSchema(DetailedTeamSchema, "teams");
|
|
11950
12843
|
|
|
12844
|
+
//#endregion
|
|
12845
|
+
//#region ../contract/src/team/team-payment-connect-init.schema.ts
|
|
12846
|
+
const PaymentProviderEnum = _enum(["STRIPE", "AIRWALLEX"]);
|
|
12847
|
+
const TeamPaymentConnectInitSchema = object({
|
|
12848
|
+
key: string$1().meta({ description: "Team identifier (ID or slug)" }),
|
|
12849
|
+
provider: PaymentProviderEnum.meta({
|
|
12850
|
+
description: "Payment processor to connect",
|
|
12851
|
+
examples: ["STRIPE", "AIRWALLEX"]
|
|
12852
|
+
})
|
|
12853
|
+
});
|
|
12854
|
+
const TeamPaymentConnectInitResponseSchema = object({ authorizationUrl: string$1().url().meta({
|
|
12855
|
+
description: "URL to redirect the user to for OAuth authorization. Open in a new window or redirect the current page.",
|
|
12856
|
+
examples: ["https://connect.stripe.com/oauth/authorize?response_type=code&client_id=ca_xxx&scope=read_write&redirect_uri=..."]
|
|
12857
|
+
}) });
|
|
12858
|
+
|
|
12859
|
+
//#endregion
|
|
12860
|
+
//#region ../contract/src/team/team-payment-disconnect.schema.ts
|
|
12861
|
+
const TeamPaymentDisconnectSchema = object({ key: string$1().meta({ description: "Team identifier (ID or slug)" }) });
|
|
12862
|
+
|
|
12863
|
+
//#endregion
|
|
12864
|
+
//#region ../contract/src/team/team-payment.contract.ts
|
|
12865
|
+
const connect = oc.route({
|
|
12866
|
+
method: "POST",
|
|
12867
|
+
path: "/teams/{key}/payment/connect",
|
|
12868
|
+
summary: "Initiate payment processor connection",
|
|
12869
|
+
description: "Start the OAuth flow to connect a team's payment processor account. Returns an authorization URL to redirect the user to the payment provider's OAuth page. The OAuth callback is handled directly by the payment gateway.",
|
|
12870
|
+
tags: ["Team Payments"]
|
|
12871
|
+
}).input(TeamPaymentConnectInitSchema.strict()).output(TeamPaymentConnectInitResponseSchema);
|
|
12872
|
+
const disconnect = oc.route({
|
|
12873
|
+
method: "POST",
|
|
12874
|
+
path: "/teams/{key}/payment/disconnect",
|
|
12875
|
+
summary: "Disconnect payment processor",
|
|
12876
|
+
description: "Remove the payment processor connection from a team. Future ticket sales will use the platform account. Only the team owner can disconnect the payment processor.",
|
|
12877
|
+
tags: ["Team Payments"]
|
|
12878
|
+
}).input(TeamPaymentDisconnectSchema.strict()).output(TeamSchema);
|
|
12879
|
+
var team_payment_contract_default = {
|
|
12880
|
+
connect,
|
|
12881
|
+
disconnect
|
|
12882
|
+
};
|
|
12883
|
+
|
|
11951
12884
|
//#endregion
|
|
11952
12885
|
//#region ../contract/src/team/team-update.schema.ts
|
|
11953
12886
|
const TeamUpdateSchema = TeamSchema.omit({
|
|
@@ -12088,6 +13021,11 @@ var features_default = {
|
|
|
12088
13021
|
"key": "region-filtering",
|
|
12089
13022
|
"description": "Enable region-based event filtering and location-aware features",
|
|
12090
13023
|
"defaultValue": false
|
|
13024
|
+
},
|
|
13025
|
+
genres: {
|
|
13026
|
+
"key": "genres",
|
|
13027
|
+
"description": "Enable genre/category filtering for events",
|
|
13028
|
+
"defaultValue": false
|
|
12091
13029
|
}
|
|
12092
13030
|
};
|
|
12093
13031
|
|
|
@@ -12107,6 +13045,10 @@ var config_default$3 = {
|
|
|
12107
13045
|
"clkwbixsi0000m9coi7i5b65z": "tem_01kach7nnvfvmbtfvgtgkb47kc"
|
|
12108
13046
|
},
|
|
12109
13047
|
defaultCurrency: "AUD",
|
|
13048
|
+
legal: {
|
|
13049
|
+
"entityName": "MIXMAG AUS/NZ PTY LTD",
|
|
13050
|
+
"taxId": "66 677 763 183"
|
|
13051
|
+
},
|
|
12110
13052
|
baseUrl: {
|
|
12111
13053
|
"dev": "http://mixmag-anz.localhost:3000",
|
|
12112
13054
|
"production": "https://beta.mixmag.au",
|
|
@@ -12134,7 +13076,8 @@ var config_default$3 = {
|
|
|
12134
13076
|
favicon: "https://assets.session.services/tenants/mixmag-anz/favicon.svg",
|
|
12135
13077
|
features: {
|
|
12136
13078
|
"promoter-signups": true,
|
|
12137
|
-
"region-filtering": true
|
|
13079
|
+
"region-filtering": true,
|
|
13080
|
+
"genres": true
|
|
12138
13081
|
},
|
|
12139
13082
|
wallet: { "apple": {
|
|
12140
13083
|
"logoUrl": "https://assets.session.services/tenant/mixmag-anz/wallet/logo.png",
|
|
@@ -12184,7 +13127,8 @@ var config_default$2 = {
|
|
|
12184
13127
|
favicon: "https://assets.dev.session.services/tenants/mixmag-asia/favicon.svg",
|
|
12185
13128
|
features: {
|
|
12186
13129
|
"promoter-signups": true,
|
|
12187
|
-
"region-filtering": true
|
|
13130
|
+
"region-filtering": true,
|
|
13131
|
+
"genres": true
|
|
12188
13132
|
},
|
|
12189
13133
|
wallet: { "apple": {
|
|
12190
13134
|
"logoUrl": "https://assets.dev.session.services/wallet-assets/tenants/mixmag-anz/logo.png",
|
|
@@ -12243,11 +13187,20 @@ var config_default = {
|
|
|
12243
13187
|
email: "hello@session.services",
|
|
12244
13188
|
adminTeamId: "tem_01jqpjksnsen9vprw95et60t3m",
|
|
12245
13189
|
defaultCurrency: "AUD",
|
|
13190
|
+
legal: {
|
|
13191
|
+
"entityName": "SESSION SERVICES PTY LTD",
|
|
13192
|
+
"taxIdLabel": "ABN",
|
|
13193
|
+
"taxId": "48 671 749 214"
|
|
13194
|
+
},
|
|
12246
13195
|
baseUrl: {
|
|
12247
13196
|
"dev": "http://localhost:3000",
|
|
12248
13197
|
"production": "https://beta.session.services",
|
|
12249
13198
|
"sandbox": "https://beta.sandbox.session.services"
|
|
12250
13199
|
},
|
|
13200
|
+
payment: {
|
|
13201
|
+
"stripePublishableKey": "pk_test_51OIOr5EJoOEO0655Co9fG0PXdqv1vn7vrJotFhy5uaHOyiw3rof9qigSLsnO6Akvl90JHVawuLoyPR2GjGBZXTnn00Hq8BxbiP",
|
|
13202
|
+
"airwallexClientId": "VwnpPlKRSbGiUlNzVfECaw"
|
|
13203
|
+
},
|
|
12251
13204
|
logo: {
|
|
12252
13205
|
"icon": {
|
|
12253
13206
|
"src": "https://assets.session.services/tenants/session-services/icon.png",
|
|
@@ -12349,6 +13302,7 @@ for (const tenant of tenantConfigs) {
|
|
|
12349
13302
|
tenantsById.set(tenant.id, tenant);
|
|
12350
13303
|
tenantsBySlug.set(tenant.slug, tenant);
|
|
12351
13304
|
if (tenant.oldId) tenantsByOldId.set(tenant.oldId, tenant);
|
|
13305
|
+
if (tenant.legacyTenantsToTeams) for (const legacyOrgId of Object.keys(tenant.legacyTenantsToTeams)) tenantsByOldId.set(legacyOrgId, tenant);
|
|
12352
13306
|
if (tenant.baseUrl.dev) {
|
|
12353
13307
|
const devHost = extractHost(tenant.baseUrl.dev);
|
|
12354
13308
|
tenantsByHost.set(devHost, tenant);
|
|
@@ -12368,25 +13322,6 @@ for (const tenant of tenantConfigs) {
|
|
|
12368
13322
|
|
|
12369
13323
|
//#endregion
|
|
12370
13324
|
//#region ../tenants/src/feature-flags.ts
|
|
12371
|
-
/**
|
|
12372
|
-
* @fileoverview Feature flags management for multi-tenant applications.
|
|
12373
|
-
*
|
|
12374
|
-
* This module provides functionality to manage feature flags with tenant-specific overrides
|
|
12375
|
-
* and global defaults. It supports a hierarchical approach where tenants can override
|
|
12376
|
-
* global feature flag settings, enabling fine-grained control over feature rollouts
|
|
12377
|
-
* across different tenants.
|
|
12378
|
-
*
|
|
12379
|
-
* @module feature-flags
|
|
12380
|
-
* @author Sessions Team
|
|
12381
|
-
* @since 1.0.0
|
|
12382
|
-
*/
|
|
12383
|
-
/**
|
|
12384
|
-
* Internal map storing all available feature flags.
|
|
12385
|
-
* Built from the features.json configuration file at module initialization.
|
|
12386
|
-
*
|
|
12387
|
-
* @private
|
|
12388
|
-
* @type {Map<string, FeatureFlag>}
|
|
12389
|
-
*/
|
|
12390
13325
|
const features = /* @__PURE__ */ new Map();
|
|
12391
13326
|
for (const [key, feature] of Object.entries(features_default)) features.set(key, feature);
|
|
12392
13327
|
|
|
@@ -12505,8 +13440,10 @@ record(string$1(), FeatureFlagModel).meta({
|
|
|
12505
13440
|
*/
|
|
12506
13441
|
/**
|
|
12507
13442
|
* Region kind enum - defines the geographic classification levels
|
|
13443
|
+
* ALL is a special top-level region representing the entire tenant coverage area
|
|
12508
13444
|
*/
|
|
12509
13445
|
const RegionKindEnum = _enum([
|
|
13446
|
+
"ALL",
|
|
12510
13447
|
"COUNTRY",
|
|
12511
13448
|
"STATE",
|
|
12512
13449
|
"CITY",
|
|
@@ -12613,6 +13550,22 @@ const RegionModel = object({
|
|
|
12613
13550
|
2,
|
|
12614
13551
|
3
|
|
12615
13552
|
]
|
|
13553
|
+
}),
|
|
13554
|
+
zoom: number$1().min(0).max(22).optional().meta({
|
|
13555
|
+
description: "Optional zoom level override for map display (0-22)",
|
|
13556
|
+
examples: [
|
|
13557
|
+
3,
|
|
13558
|
+
6,
|
|
13559
|
+
12
|
|
13560
|
+
]
|
|
13561
|
+
}),
|
|
13562
|
+
heroImage: string$1().optional().meta({
|
|
13563
|
+
description: "Hero image base URL without extension. Component adds .webp/.jpg for browser fallback.",
|
|
13564
|
+
examples: ["https://assets.session.services/regions/hero/sydney"]
|
|
13565
|
+
}),
|
|
13566
|
+
description: string$1().optional().meta({
|
|
13567
|
+
description: "Description for events in this region, displayed in the hero banner below the title.",
|
|
13568
|
+
examples: ["Home to world-class venues, legendary club nights, and a diverse electronic music scene, Sydney delivers unforgettable experiences year-round."]
|
|
12616
13569
|
})
|
|
12617
13570
|
}).meta({
|
|
12618
13571
|
description: "Region schema for validating geographic regions with hierarchical support",
|
|
@@ -12725,6 +13678,20 @@ object({
|
|
|
12725
13678
|
description: "Default currency code for the tenant (e.g., 'USD', 'EUR')",
|
|
12726
13679
|
examples: ["AUD"]
|
|
12727
13680
|
}),
|
|
13681
|
+
legal: object({
|
|
13682
|
+
entityName: string$1().meta({
|
|
13683
|
+
description: "Registered legal entity name",
|
|
13684
|
+
examples: ["Session Services Pty Ltd"]
|
|
13685
|
+
}),
|
|
13686
|
+
taxIdLabel: string$1().optional().meta({
|
|
13687
|
+
description: "Label for the tax identifier (e.g., ABN, GST, VAT)",
|
|
13688
|
+
examples: ["ABN", "GST"]
|
|
13689
|
+
}),
|
|
13690
|
+
taxId: string$1().meta({
|
|
13691
|
+
description: "Tax identifier or business registration number",
|
|
13692
|
+
examples: ["48 671 749 214"]
|
|
13693
|
+
})
|
|
13694
|
+
}).optional().meta({ description: "Legal/tax identity information for payout statements and invoices" }),
|
|
12728
13695
|
baseUrl: object({
|
|
12729
13696
|
dev: string$1().optional().meta({
|
|
12730
13697
|
description: "Development environment URL",
|
|
@@ -12829,7 +13796,21 @@ object({
|
|
|
12829
13796
|
description: "Google Play Store URL for the tenant's mobile app",
|
|
12830
13797
|
examples: ["https://play.google.com/store/apps/details?id=com.sessions.app"]
|
|
12831
13798
|
})
|
|
12832
|
-
}).optional().meta({ description: "Mobile app store URLs for promoting app downloads to event organizers" })
|
|
13799
|
+
}).optional().meta({ description: "Mobile app store URLs for promoting app downloads to event organizers" }),
|
|
13800
|
+
payment: object({
|
|
13801
|
+
stripePublishableKey: string$1().regex(/^pk_(live|test)_[A-Za-z0-9]+$/, { message: "Invalid Stripe publishable key format. Must start with pk_live_ or pk_test_ followed by alphanumeric characters" }).optional().meta({
|
|
13802
|
+
description: "Stripe publishable key for client-side payment integration. Must match format pk_live_* or pk_test_*",
|
|
13803
|
+
examples: ["pk_test_51ABC123DEFxyzABCDEFghijKLMNopqrSTUVwxyz"]
|
|
13804
|
+
}),
|
|
13805
|
+
airwallexClientId: string$1().optional().meta({
|
|
13806
|
+
description: "Airwallex client ID for payment processing",
|
|
13807
|
+
examples: ["abc123-client-id"]
|
|
13808
|
+
}),
|
|
13809
|
+
stripeAccountId: string$1().regex(/^acct_[A-Za-z0-9]+$/, { message: "Invalid Stripe account ID format. Must start with acct_ followed by alphanumeric characters" }).optional().meta({
|
|
13810
|
+
description: "Connected Stripe account ID for receiving tenant fee transfers from Stripe Connect payments",
|
|
13811
|
+
examples: ["acct_1ABC123DEFxyz"]
|
|
13812
|
+
})
|
|
13813
|
+
}).optional().meta({ description: "Payment gateway public keys for checkout integration" })
|
|
12833
13814
|
}).meta({
|
|
12834
13815
|
description: "Tenant configuration schema for validating complete tenant settings including identity, branding, URLs, and feature flags",
|
|
12835
13816
|
examples: [{
|
|
@@ -12873,13 +13854,31 @@ object({
|
|
|
12873
13854
|
//#endregion
|
|
12874
13855
|
//#region ../tenants/configs/mixmag-anz/regions.json
|
|
12875
13856
|
var regions_default$3 = [
|
|
13857
|
+
{
|
|
13858
|
+
"id": "rgn_01jxk9m4a0000000000000all",
|
|
13859
|
+
"name": "All",
|
|
13860
|
+
"slug": "all",
|
|
13861
|
+
"enabled": true,
|
|
13862
|
+
"order": 0,
|
|
13863
|
+
"kind": "ALL",
|
|
13864
|
+
"latitude": -30,
|
|
13865
|
+
"longitude": 155,
|
|
13866
|
+
"zoom": 1,
|
|
13867
|
+
"heroImage": "https://assets.session.services/regions/hero/all",
|
|
13868
|
+
"description": "Discover live music, club nights, and unforgettable experiences across all locations."
|
|
13869
|
+
},
|
|
12876
13870
|
{
|
|
12877
13871
|
"id": "rgn_01k2sv1ddzesmrym079hzw06h8",
|
|
12878
13872
|
"name": "Australia",
|
|
12879
13873
|
"slug": "australia",
|
|
12880
13874
|
"enabled": true,
|
|
12881
13875
|
"order": 1,
|
|
12882
|
-
"kind": "COUNTRY"
|
|
13876
|
+
"kind": "COUNTRY",
|
|
13877
|
+
"latitude": -25.2744,
|
|
13878
|
+
"longitude": 133.7751,
|
|
13879
|
+
"zoom": 2,
|
|
13880
|
+
"heroImage": "https://assets.session.services/regions/hero/australia",
|
|
13881
|
+
"description": "From underground warehouse parties to world-class festivals, Australia's music scene has something for every taste. Discover club nights, live performances, and unforgettable experiences across the country's most vibrant cities."
|
|
12883
13882
|
},
|
|
12884
13883
|
{
|
|
12885
13884
|
"id": "rgn_01k2sv1ddzesmrym0enmyhdtxs",
|
|
@@ -12888,7 +13887,10 @@ var regions_default$3 = [
|
|
|
12888
13887
|
"enabled": true,
|
|
12889
13888
|
"order": 1,
|
|
12890
13889
|
"parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
|
|
12891
|
-
"kind": "STATE"
|
|
13890
|
+
"kind": "STATE",
|
|
13891
|
+
"latitude": -33.8688,
|
|
13892
|
+
"longitude": 151.2093,
|
|
13893
|
+
"zoom": 6
|
|
12892
13894
|
},
|
|
12893
13895
|
{
|
|
12894
13896
|
"id": "rgn_01k2sv1ddzesmrym0hvj4ms6wh",
|
|
@@ -12899,7 +13901,24 @@ var regions_default$3 = [
|
|
|
12899
13901
|
"parentId": "rgn_01k2sv1ddzesmrym0enmyhdtxs",
|
|
12900
13902
|
"latitude": -33.8688,
|
|
12901
13903
|
"longitude": 151.2093,
|
|
12902
|
-
"kind": "CITY"
|
|
13904
|
+
"kind": "CITY",
|
|
13905
|
+
"zoom": 11,
|
|
13906
|
+
"heroImage": "https://assets.session.services/regions/hero/sydney",
|
|
13907
|
+
"description": "Home to world-class venues, legendary club nights, and a diverse electronic music scene, Sydney delivers unforgettable experiences year-round. From harbour-side festivals to underground warehouse parties, discover what's on in Australia's biggest city."
|
|
13908
|
+
},
|
|
13909
|
+
{
|
|
13910
|
+
"id": "rgn_01jwtk8p6h0gqxm4n7r2s5v9by",
|
|
13911
|
+
"name": "Byron Bay",
|
|
13912
|
+
"slug": "byron-bay",
|
|
13913
|
+
"enabled": true,
|
|
13914
|
+
"order": 2,
|
|
13915
|
+
"parentId": "rgn_01k2sv1ddzesmrym0enmyhdtxs",
|
|
13916
|
+
"latitude": -28.6392,
|
|
13917
|
+
"longitude": 153.6091,
|
|
13918
|
+
"kind": "CITY",
|
|
13919
|
+
"zoom": 13,
|
|
13920
|
+
"heroImage": "https://assets.session.services/regions/hero/byron-bay",
|
|
13921
|
+
"description": "Where laid-back beach vibes meet world-class music, Byron Bay hosts some of Australia's most iconic festivals and intimate venue experiences. Discover live performances, DJ sets, and outdoor events in this legendary coastal destination."
|
|
12903
13922
|
},
|
|
12904
13923
|
{
|
|
12905
13924
|
"id": "rgn_01k2sv1ddzesmrym0vezgd1xjm",
|
|
@@ -12908,18 +13927,24 @@ var regions_default$3 = [
|
|
|
12908
13927
|
"enabled": true,
|
|
12909
13928
|
"order": 2,
|
|
12910
13929
|
"parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
|
|
12911
|
-
"kind": "STATE"
|
|
13930
|
+
"kind": "STATE",
|
|
13931
|
+
"latitude": -37.8136,
|
|
13932
|
+
"longitude": 144.9631,
|
|
13933
|
+
"zoom": 7
|
|
12912
13934
|
},
|
|
12913
13935
|
{
|
|
12914
13936
|
"id": "rgn_01k2sv1ddzesmrym11c64mmpxm",
|
|
12915
13937
|
"name": "Melbourne",
|
|
12916
13938
|
"slug": "melbourne",
|
|
12917
13939
|
"enabled": true,
|
|
12918
|
-
"order":
|
|
13940
|
+
"order": 1,
|
|
12919
13941
|
"parentId": "rgn_01k2sv1ddzesmrym0vezgd1xjm",
|
|
12920
13942
|
"latitude": -37.8136,
|
|
12921
13943
|
"longitude": 144.9631,
|
|
12922
|
-
"kind": "CITY"
|
|
13944
|
+
"kind": "CITY",
|
|
13945
|
+
"zoom": 11,
|
|
13946
|
+
"heroImage": "https://assets.session.services/regions/hero/melbourne",
|
|
13947
|
+
"description": "Australia's undisputed cultural capital boasts a legendary music scene, from intimate laneway bars to iconic venues that have launched countless artists. Discover club nights, live performances, and festivals in a city that lives and breathes music."
|
|
12923
13948
|
},
|
|
12924
13949
|
{
|
|
12925
13950
|
"id": "rgn_01k2sv1ddzesmrym1e3pbk81es",
|
|
@@ -12928,37 +13953,223 @@ var regions_default$3 = [
|
|
|
12928
13953
|
"enabled": true,
|
|
12929
13954
|
"order": 3,
|
|
12930
13955
|
"parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
|
|
12931
|
-
"kind": "STATE"
|
|
13956
|
+
"kind": "STATE",
|
|
13957
|
+
"latitude": -27.4698,
|
|
13958
|
+
"longitude": 153.0251,
|
|
13959
|
+
"zoom": 5
|
|
12932
13960
|
},
|
|
12933
13961
|
{
|
|
12934
13962
|
"id": "rgn_01k2sv1ddzesmrym1mxb6te1px",
|
|
12935
13963
|
"name": "Brisbane",
|
|
12936
13964
|
"slug": "brisbane",
|
|
12937
13965
|
"enabled": true,
|
|
12938
|
-
"order":
|
|
13966
|
+
"order": 1,
|
|
12939
13967
|
"parentId": "rgn_01k2sv1ddzesmrym1e3pbk81es",
|
|
12940
13968
|
"latitude": -27.4698,
|
|
12941
13969
|
"longitude": 153.0251,
|
|
12942
|
-
"kind": "CITY"
|
|
13970
|
+
"kind": "CITY",
|
|
13971
|
+
"zoom": 11,
|
|
13972
|
+
"heroImage": "https://assets.session.services/regions/hero/brisbane",
|
|
13973
|
+
"description": "Brisbane's music scene is thriving with a mix of established venues and emerging spaces hosting everything from electronic nights to live performances. Discover events in Queensland's sunshine capital."
|
|
12943
13974
|
},
|
|
12944
13975
|
{
|
|
12945
|
-
"id": "
|
|
12946
|
-
"name": "
|
|
12947
|
-
"slug": "
|
|
13976
|
+
"id": "rgn_01jwtk8p6h1hry2n5p8t3w6acz",
|
|
13977
|
+
"name": "Gold Coast",
|
|
13978
|
+
"slug": "gold-coast",
|
|
12948
13979
|
"enabled": true,
|
|
12949
13980
|
"order": 2,
|
|
12950
|
-
"
|
|
13981
|
+
"parentId": "rgn_01k2sv1ddzesmrym1e3pbk81es",
|
|
13982
|
+
"latitude": -28.0003,
|
|
13983
|
+
"longitude": 153.4309,
|
|
13984
|
+
"kind": "CITY",
|
|
13985
|
+
"zoom": 12,
|
|
13986
|
+
"heroImage": "https://assets.session.services/regions/hero/gold-coast",
|
|
13987
|
+
"description": "Beyond the endless beaches lies a pumping nightlife scene with beachside clubs, rooftop bars, and venues hosting international and local talent. Discover parties, festivals, and live music on Australia's ultimate playground."
|
|
12951
13988
|
},
|
|
12952
13989
|
{
|
|
12953
|
-
"id": "
|
|
12954
|
-
"name": "
|
|
12955
|
-
"slug": "
|
|
13990
|
+
"id": "rgn_01jwtk8p6h2jsz3p6q9u4x7bdz",
|
|
13991
|
+
"name": "Western Australia",
|
|
13992
|
+
"slug": "wa",
|
|
12956
13993
|
"enabled": true,
|
|
12957
13994
|
"order": 4,
|
|
13995
|
+
"parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
|
|
13996
|
+
"kind": "STATE",
|
|
13997
|
+
"latitude": -31.9535,
|
|
13998
|
+
"longitude": 115.857,
|
|
13999
|
+
"zoom": 5
|
|
14000
|
+
},
|
|
14001
|
+
{
|
|
14002
|
+
"id": "rgn_01jwtk8p6h3kta4q7r0v5y8cey",
|
|
14003
|
+
"name": "Perth",
|
|
14004
|
+
"slug": "perth",
|
|
14005
|
+
"enabled": true,
|
|
14006
|
+
"order": 1,
|
|
14007
|
+
"parentId": "rgn_01jwtk8p6h2jsz3p6q9u4x7bdz",
|
|
14008
|
+
"latitude": -31.9535,
|
|
14009
|
+
"longitude": 115.857,
|
|
14010
|
+
"kind": "CITY",
|
|
14011
|
+
"zoom": 11,
|
|
14012
|
+
"heroImage": "https://assets.session.services/regions/hero/perth",
|
|
14013
|
+
"description": "Australia's sunniest capital has cultivated a thriving underground scene alongside world-class festivals. From beachside parties to intimate club nights, discover events in this isolated yet vibrant music destination."
|
|
14014
|
+
},
|
|
14015
|
+
{
|
|
14016
|
+
"id": "rgn_01jwtk8p6h4ltb5r8s1w6z9dfz",
|
|
14017
|
+
"name": "South Australia",
|
|
14018
|
+
"slug": "sa",
|
|
14019
|
+
"enabled": true,
|
|
14020
|
+
"order": 5,
|
|
14021
|
+
"parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
|
|
14022
|
+
"kind": "STATE",
|
|
14023
|
+
"latitude": -34.929,
|
|
14024
|
+
"longitude": 138.601,
|
|
14025
|
+
"zoom": 6
|
|
14026
|
+
},
|
|
14027
|
+
{
|
|
14028
|
+
"id": "rgn_01jwtk8p6h5muc6s9t2x70ega0",
|
|
14029
|
+
"name": "Adelaide",
|
|
14030
|
+
"slug": "adelaide",
|
|
14031
|
+
"enabled": true,
|
|
14032
|
+
"order": 1,
|
|
14033
|
+
"parentId": "rgn_01jwtk8p6h4ltb5r8s1w6z9dfz",
|
|
14034
|
+
"latitude": -34.929,
|
|
14035
|
+
"longitude": 138.601,
|
|
14036
|
+
"kind": "CITY",
|
|
14037
|
+
"zoom": 11,
|
|
14038
|
+
"heroImage": "https://assets.session.services/regions/hero/adelaide",
|
|
14039
|
+
"description": "One of Australia's best-kept secrets, Adelaide's intimate music scene features converted warehouses, historic venues, and a festival culture that rivals any city. Discover events in South Australia's creative heart."
|
|
14040
|
+
},
|
|
14041
|
+
{
|
|
14042
|
+
"id": "rgn_01jwtk8p6h6nvd7t0u3y81fhb1",
|
|
14043
|
+
"name": "Tasmania",
|
|
14044
|
+
"slug": "tasmania",
|
|
14045
|
+
"enabled": true,
|
|
14046
|
+
"order": 6,
|
|
14047
|
+
"parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
|
|
14048
|
+
"kind": "STATE",
|
|
14049
|
+
"latitude": -42.8828,
|
|
14050
|
+
"longitude": 147.3258,
|
|
14051
|
+
"zoom": 7
|
|
14052
|
+
},
|
|
14053
|
+
{
|
|
14054
|
+
"id": "rgn_01jwtk8p6h7owe8u1v4z92gic2",
|
|
14055
|
+
"name": "Hobart",
|
|
14056
|
+
"slug": "hobart",
|
|
14057
|
+
"enabled": true,
|
|
14058
|
+
"order": 1,
|
|
14059
|
+
"parentId": "rgn_01jwtk8p6h6nvd7t0u3y81fhb1",
|
|
14060
|
+
"latitude": -42.8828,
|
|
14061
|
+
"longitude": 147.3258,
|
|
14062
|
+
"kind": "CITY",
|
|
14063
|
+
"zoom": 12,
|
|
14064
|
+
"heroImage": "https://assets.session.services/regions/hero/hobart",
|
|
14065
|
+
"description": "Compact yet culturally mighty, Hobart combines heritage venues with a thriving arts community and innovative event spaces. Discover intimate gigs, festivals, and unique experiences in Tasmania's creative capital."
|
|
14066
|
+
},
|
|
14067
|
+
{
|
|
14068
|
+
"id": "rgn_01jwtk8p6h8pxf9v2w50a3hjd3",
|
|
14069
|
+
"name": "Australian Capital Territory",
|
|
14070
|
+
"slug": "act",
|
|
14071
|
+
"enabled": true,
|
|
14072
|
+
"order": 7,
|
|
14073
|
+
"parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
|
|
14074
|
+
"kind": "STATE",
|
|
14075
|
+
"latitude": -35.282,
|
|
14076
|
+
"longitude": 149.129,
|
|
14077
|
+
"zoom": 10
|
|
14078
|
+
},
|
|
14079
|
+
{
|
|
14080
|
+
"id": "rgn_01jwtk8p6h9qyg0w3x61b4ike4",
|
|
14081
|
+
"name": "Canberra",
|
|
14082
|
+
"slug": "canberra",
|
|
14083
|
+
"enabled": true,
|
|
14084
|
+
"order": 1,
|
|
14085
|
+
"parentId": "rgn_01jwtk8p6h8pxf9v2w50a3hjd3",
|
|
14086
|
+
"latitude": -35.282,
|
|
14087
|
+
"longitude": 149.129,
|
|
14088
|
+
"kind": "CITY",
|
|
14089
|
+
"zoom": 12,
|
|
14090
|
+
"heroImage": "https://assets.session.services/regions/hero/canberra",
|
|
14091
|
+
"description": "Beyond the politics lies a surprisingly vibrant music scene with intimate venues and a community that punches above its weight. Discover club nights, live performances, and events in Australia's capital."
|
|
14092
|
+
},
|
|
14093
|
+
{
|
|
14094
|
+
"id": "rgn_01jwtk8p6h0rzh1x4y72c5jlf5",
|
|
14095
|
+
"name": "Northern Territory",
|
|
14096
|
+
"slug": "nt",
|
|
14097
|
+
"enabled": true,
|
|
14098
|
+
"order": 8,
|
|
14099
|
+
"parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
|
|
14100
|
+
"kind": "STATE",
|
|
14101
|
+
"latitude": -12.4628,
|
|
14102
|
+
"longitude": 130.8418,
|
|
14103
|
+
"zoom": 5
|
|
14104
|
+
},
|
|
14105
|
+
{
|
|
14106
|
+
"id": "rgn_01jwtk8p6h1s0i2y5z83d6kmg6",
|
|
14107
|
+
"name": "Darwin",
|
|
14108
|
+
"slug": "darwin",
|
|
14109
|
+
"enabled": true,
|
|
14110
|
+
"order": 1,
|
|
14111
|
+
"parentId": "rgn_01jwtk8p6h0rzh1x4y72c5jlf5",
|
|
14112
|
+
"latitude": -12.4628,
|
|
14113
|
+
"longitude": 130.8418,
|
|
14114
|
+
"kind": "CITY",
|
|
14115
|
+
"zoom": 12,
|
|
14116
|
+
"heroImage": "https://assets.session.services/regions/hero/darwin",
|
|
14117
|
+
"description": "Australia's tropical capital offers a unique events scene where outdoor festivals, sunset sessions, and intimate venues come alive under starlit skies. Discover what's on in the Top End."
|
|
14118
|
+
},
|
|
14119
|
+
{
|
|
14120
|
+
"id": "rgn_01k2sv1ddzesmrym1stdjswc9t",
|
|
14121
|
+
"name": "New Zealand",
|
|
14122
|
+
"slug": "new-zealand",
|
|
14123
|
+
"enabled": true,
|
|
14124
|
+
"order": 2,
|
|
14125
|
+
"kind": "COUNTRY",
|
|
14126
|
+
"latitude": -40.9006,
|
|
14127
|
+
"longitude": 174.886,
|
|
14128
|
+
"zoom": 5,
|
|
14129
|
+
"heroImage": "https://assets.session.services/regions/hero/new-zealand",
|
|
14130
|
+
"description": "From the soaring peaks of the Southern Alps to intimate club venues, New Zealand's music scene punches above its weight. Discover live performances, DJ nights, and festivals across Aotearoa's most vibrant cities."
|
|
14131
|
+
},
|
|
14132
|
+
{
|
|
14133
|
+
"id": "rgn_01k2sv1ddzesmrym211cw0cgv2",
|
|
14134
|
+
"name": "Auckland",
|
|
14135
|
+
"slug": "auckland",
|
|
14136
|
+
"enabled": true,
|
|
14137
|
+
"order": 1,
|
|
12958
14138
|
"parentId": "rgn_01k2sv1ddzesmrym1stdjswc9t",
|
|
12959
14139
|
"latitude": -36.8485,
|
|
12960
14140
|
"longitude": 174.7633,
|
|
12961
|
-
"kind": "CITY"
|
|
14141
|
+
"kind": "CITY",
|
|
14142
|
+
"zoom": 11,
|
|
14143
|
+
"heroImage": "https://assets.session.services/regions/hero/auckland",
|
|
14144
|
+
"description": "New Zealand's largest city buzzes with a diverse music scene spanning intimate venues, waterfront festivals, and club nights that keep the city moving. Discover events across Auckland's vibrant neighbourhoods."
|
|
14145
|
+
},
|
|
14146
|
+
{
|
|
14147
|
+
"id": "rgn_01jwtk8p6h2t1j3z60a4e7lnh7",
|
|
14148
|
+
"name": "Wellington",
|
|
14149
|
+
"slug": "wellington",
|
|
14150
|
+
"enabled": true,
|
|
14151
|
+
"order": 2,
|
|
14152
|
+
"parentId": "rgn_01k2sv1ddzesmrym1stdjswc9t",
|
|
14153
|
+
"latitude": -41.2866,
|
|
14154
|
+
"longitude": 174.7756,
|
|
14155
|
+
"kind": "CITY",
|
|
14156
|
+
"zoom": 12,
|
|
14157
|
+
"heroImage": "https://assets.session.services/regions/hero/wellington",
|
|
14158
|
+
"description": "New Zealand's creative capital delivers a music scene as bold as its coffee culture. From legendary venues to intimate bars tucked into historic laneways, discover club nights, live performances, and festivals in Welly."
|
|
14159
|
+
},
|
|
14160
|
+
{
|
|
14161
|
+
"id": "rgn_01jwtk8p6h3u2k4071b5f8moi8",
|
|
14162
|
+
"name": "Christchurch",
|
|
14163
|
+
"slug": "christchurch",
|
|
14164
|
+
"enabled": true,
|
|
14165
|
+
"order": 3,
|
|
14166
|
+
"parentId": "rgn_01k2sv1ddzesmrym1stdjswc9t",
|
|
14167
|
+
"latitude": -43.531,
|
|
14168
|
+
"longitude": 172.6365,
|
|
14169
|
+
"kind": "CITY",
|
|
14170
|
+
"zoom": 12,
|
|
14171
|
+
"heroImage": "https://assets.session.services/regions/hero/christchurch",
|
|
14172
|
+
"description": "Rising from reinvention, Christchurch's music scene features innovative venues, intimate spaces, and a community spirit that makes every event special. Discover what's on in the Garden City."
|
|
12962
14173
|
}
|
|
12963
14174
|
];
|
|
12964
14175
|
|
|
@@ -12973,7 +14184,10 @@ var regions_default$2 = [
|
|
|
12973
14184
|
"order": 1,
|
|
12974
14185
|
"latitude": 22.3193,
|
|
12975
14186
|
"longitude": 114.1694,
|
|
12976
|
-
"kind": "CITY"
|
|
14187
|
+
"kind": "CITY",
|
|
14188
|
+
"zoom": 11,
|
|
14189
|
+
"heroImage": "https://assets.session.services/regions/hero/hong-kong",
|
|
14190
|
+
"description": "Where East meets West on the dancefloor, Hong Kong's nightlife spans rooftop clubs with skyline views to underground venues pushing electronic music forward. Discover events in Asia's most dynamic city."
|
|
12977
14191
|
},
|
|
12978
14192
|
{
|
|
12979
14193
|
"id": "rgn_01k2sv1de0esmrym2jyqmx3zqq",
|
|
@@ -12983,7 +14197,10 @@ var regions_default$2 = [
|
|
|
12983
14197
|
"order": 2,
|
|
12984
14198
|
"latitude": 1.3521,
|
|
12985
14199
|
"longitude": 103.8198,
|
|
12986
|
-
"kind": "CITY"
|
|
14200
|
+
"kind": "CITY",
|
|
14201
|
+
"zoom": 11,
|
|
14202
|
+
"heroImage": "https://assets.session.services/regions/hero/singapore",
|
|
14203
|
+
"description": "From the iconic clubs of Clarke Quay to intimate venues pushing boundaries, Singapore's tightly curated music scene delivers world-class experiences. Discover events in Southeast Asia's nightlife capital."
|
|
12987
14204
|
},
|
|
12988
14205
|
{
|
|
12989
14206
|
"id": "rgn_01k2sv1de0esmrym2tv10tsqmd",
|
|
@@ -12993,7 +14210,10 @@ var regions_default$2 = [
|
|
|
12993
14210
|
"order": 3,
|
|
12994
14211
|
"latitude": 13.7563,
|
|
12995
14212
|
"longitude": 100.5018,
|
|
12996
|
-
"kind": "CITY"
|
|
14213
|
+
"kind": "CITY",
|
|
14214
|
+
"zoom": 11,
|
|
14215
|
+
"heroImage": "https://assets.session.services/regions/hero/bangkok",
|
|
14216
|
+
"description": "A city that never sleeps, Bangkok's nightlife ranges from legendary clubs to rooftop bars and underground warehouse parties. Discover events in Thailand's pulsing capital where anything goes."
|
|
12997
14217
|
},
|
|
12998
14218
|
{
|
|
12999
14219
|
"id": "rgn_01k2sv1de0esmrym32fj7p92nx",
|
|
@@ -13003,7 +14223,10 @@ var regions_default$2 = [
|
|
|
13003
14223
|
"order": 4,
|
|
13004
14224
|
"latitude": 35.6762,
|
|
13005
14225
|
"longitude": 139.6503,
|
|
13006
|
-
"kind": "CITY"
|
|
14226
|
+
"kind": "CITY",
|
|
14227
|
+
"zoom": 10,
|
|
14228
|
+
"heroImage": "https://assets.session.services/regions/hero/tokyo",
|
|
14229
|
+
"description": "From the neon-lit clubs of Shibuya to intimate listening bars in Golden Gai, Tokyo's music scene is as diverse as the city itself. Discover events in a megacity where tradition and innovation collide on the dancefloor."
|
|
13007
14230
|
},
|
|
13008
14231
|
{
|
|
13009
14232
|
"id": "rgn_01k2sv1de0esmrym38dsy67mfn",
|
|
@@ -13013,7 +14236,10 @@ var regions_default$2 = [
|
|
|
13013
14236
|
"order": 5,
|
|
13014
14237
|
"latitude": -6.2088,
|
|
13015
14238
|
"longitude": 106.8456,
|
|
13016
|
-
"kind": "CITY"
|
|
14239
|
+
"kind": "CITY",
|
|
14240
|
+
"zoom": 11,
|
|
14241
|
+
"heroImage": "https://assets.session.services/regions/hero/jakarta",
|
|
14242
|
+
"description": "Indonesia's sprawling capital hides a thriving club scene behind its urban facade. From glamorous venues to underground parties, discover events in Southeast Asia's most underrated nightlife destination."
|
|
13017
14243
|
}
|
|
13018
14244
|
];
|
|
13019
14245
|
|
|
@@ -13033,7 +14259,8 @@ var regions_default$1 = [
|
|
|
13033
14259
|
"latitude": -33.8893,
|
|
13034
14260
|
"longitude": 151.2228,
|
|
13035
14261
|
"radius": 1,
|
|
13036
|
-
"kind": "VENUE"
|
|
14262
|
+
"kind": "VENUE",
|
|
14263
|
+
"zoom": 16
|
|
13037
14264
|
},
|
|
13038
14265
|
{
|
|
13039
14266
|
"id": "rgn_01k4wrdsw0e4as5ezy5vtfmxak",
|
|
@@ -13048,7 +14275,8 @@ var regions_default$1 = [
|
|
|
13048
14275
|
"latitude": -33.8916,
|
|
13049
14276
|
"longitude": 151.2505,
|
|
13050
14277
|
"radius": 1,
|
|
13051
|
-
"kind": "VENUE"
|
|
14278
|
+
"kind": "VENUE",
|
|
14279
|
+
"zoom": 16
|
|
13052
14280
|
},
|
|
13053
14281
|
{
|
|
13054
14282
|
"id": "rgn_01k4wrdsw0e4as5f03mtj7135x",
|
|
@@ -13063,20 +14291,36 @@ var regions_default$1 = [
|
|
|
13063
14291
|
"latitude": -35.3289,
|
|
13064
14292
|
"longitude": 149.174,
|
|
13065
14293
|
"radius": 1,
|
|
13066
|
-
"kind": "VENUE"
|
|
14294
|
+
"kind": "VENUE",
|
|
14295
|
+
"zoom": 16
|
|
13067
14296
|
}
|
|
13068
14297
|
];
|
|
13069
14298
|
|
|
13070
14299
|
//#endregion
|
|
13071
14300
|
//#region ../tenants/configs/session-services/regions.json
|
|
13072
14301
|
var regions_default = [
|
|
14302
|
+
{
|
|
14303
|
+
"id": "rgn_01k2sv1ddzesmrym0all000000",
|
|
14304
|
+
"name": "All Events",
|
|
14305
|
+
"slug": "all",
|
|
14306
|
+
"enabled": true,
|
|
14307
|
+
"order": 0,
|
|
14308
|
+
"kind": "ALL",
|
|
14309
|
+
"heroImage": "https://assets.session.services/regions/hero/all",
|
|
14310
|
+
"description": "Discover live music, club nights, and unforgettable experiences across all locations."
|
|
14311
|
+
},
|
|
13073
14312
|
{
|
|
13074
14313
|
"id": "rgn_01k2sv1ddzesmrym079hzw06h8",
|
|
13075
14314
|
"name": "Australia",
|
|
13076
14315
|
"slug": "australia",
|
|
13077
14316
|
"enabled": true,
|
|
13078
14317
|
"order": 1,
|
|
13079
|
-
"kind": "COUNTRY"
|
|
14318
|
+
"kind": "COUNTRY",
|
|
14319
|
+
"latitude": -25.2744,
|
|
14320
|
+
"longitude": 133.7751,
|
|
14321
|
+
"zoom": 4,
|
|
14322
|
+
"heroImage": "https://assets.session.services/regions/hero/australia",
|
|
14323
|
+
"description": "From underground warehouse parties to world-class festivals, Australia's music scene has something for every taste. Discover club nights, live performances, and unforgettable experiences across the country's most vibrant cities."
|
|
13080
14324
|
},
|
|
13081
14325
|
{
|
|
13082
14326
|
"id": "rgn_01k2sv1ddzesmrym0enmyhdtxs",
|
|
@@ -13085,7 +14329,10 @@ var regions_default = [
|
|
|
13085
14329
|
"enabled": true,
|
|
13086
14330
|
"order": 1,
|
|
13087
14331
|
"parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
|
|
13088
|
-
"kind": "STATE"
|
|
14332
|
+
"kind": "STATE",
|
|
14333
|
+
"latitude": -33.8688,
|
|
14334
|
+
"longitude": 151.2093,
|
|
14335
|
+
"zoom": 6
|
|
13089
14336
|
},
|
|
13090
14337
|
{
|
|
13091
14338
|
"id": "rgn_01k2sv1ddzesmrym0hvj4ms6wh",
|
|
@@ -13096,7 +14343,10 @@ var regions_default = [
|
|
|
13096
14343
|
"parentId": "rgn_01k2sv1ddzesmrym0enmyhdtxs",
|
|
13097
14344
|
"latitude": -33.8688,
|
|
13098
14345
|
"longitude": 151.2093,
|
|
13099
|
-
"kind": "CITY"
|
|
14346
|
+
"kind": "CITY",
|
|
14347
|
+
"zoom": 11,
|
|
14348
|
+
"heroImage": "https://assets.session.services/regions/hero/sydney",
|
|
14349
|
+
"description": "Home to world-class venues, legendary club nights, and a diverse electronic music scene, Sydney delivers unforgettable experiences year-round. From harbour-side festivals to underground warehouse parties, discover what's on in Australia's biggest city."
|
|
13100
14350
|
},
|
|
13101
14351
|
{
|
|
13102
14352
|
"id": "rgn_01k2sv1ddzesmrym0vezgd1xjm",
|
|
@@ -13105,7 +14355,10 @@ var regions_default = [
|
|
|
13105
14355
|
"enabled": true,
|
|
13106
14356
|
"order": 2,
|
|
13107
14357
|
"parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
|
|
13108
|
-
"kind": "STATE"
|
|
14358
|
+
"kind": "STATE",
|
|
14359
|
+
"latitude": -37.8136,
|
|
14360
|
+
"longitude": 144.9631,
|
|
14361
|
+
"zoom": 7
|
|
13109
14362
|
},
|
|
13110
14363
|
{
|
|
13111
14364
|
"id": "rgn_01k2sv1ddzesmrym11c64mmpxm",
|
|
@@ -13116,7 +14369,10 @@ var regions_default = [
|
|
|
13116
14369
|
"parentId": "rgn_01k2sv1ddzesmrym0vezgd1xjm",
|
|
13117
14370
|
"latitude": -37.8136,
|
|
13118
14371
|
"longitude": 144.9631,
|
|
13119
|
-
"kind": "CITY"
|
|
14372
|
+
"kind": "CITY",
|
|
14373
|
+
"zoom": 11,
|
|
14374
|
+
"heroImage": "https://assets.session.services/regions/hero/melbourne",
|
|
14375
|
+
"description": "Australia's undisputed cultural capital boasts a legendary music scene, from intimate laneway bars to iconic venues that have launched countless artists. Discover club nights, live performances, and festivals in a city that lives and breathes music."
|
|
13120
14376
|
},
|
|
13121
14377
|
{
|
|
13122
14378
|
"id": "rgn_01k2sv1ddzesmrym1e3pbk81es",
|
|
@@ -13125,7 +14381,10 @@ var regions_default = [
|
|
|
13125
14381
|
"enabled": true,
|
|
13126
14382
|
"order": 3,
|
|
13127
14383
|
"parentId": "rgn_01k2sv1ddzesmrym079hzw06h8",
|
|
13128
|
-
"kind": "STATE"
|
|
14384
|
+
"kind": "STATE",
|
|
14385
|
+
"latitude": -27.4698,
|
|
14386
|
+
"longitude": 153.0251,
|
|
14387
|
+
"zoom": 5
|
|
13129
14388
|
},
|
|
13130
14389
|
{
|
|
13131
14390
|
"id": "rgn_01k2sv1ddzesmrym1mxb6te1px",
|
|
@@ -13136,7 +14395,10 @@ var regions_default = [
|
|
|
13136
14395
|
"parentId": "rgn_01k2sv1ddzesmrym1e3pbk81es",
|
|
13137
14396
|
"latitude": -27.4698,
|
|
13138
14397
|
"longitude": 153.0251,
|
|
13139
|
-
"kind": "CITY"
|
|
14398
|
+
"kind": "CITY",
|
|
14399
|
+
"zoom": 11,
|
|
14400
|
+
"heroImage": "https://assets.session.services/regions/hero/brisbane",
|
|
14401
|
+
"description": "Brisbane's music scene is thriving with a mix of established venues and emerging spaces hosting everything from electronic nights to live performances. Discover events in Queensland's sunshine capital."
|
|
13140
14402
|
}
|
|
13141
14403
|
];
|
|
13142
14404
|
|
|
@@ -13396,7 +14658,6 @@ const TicketSectionSchema = object({
|
|
|
13396
14658
|
const TicketStatusEnum = _enum([
|
|
13397
14659
|
"ACTIVE",
|
|
13398
14660
|
"REDEEMED",
|
|
13399
|
-
"REFUNDED",
|
|
13400
14661
|
"CANCELLED"
|
|
13401
14662
|
]);
|
|
13402
14663
|
const TicketSchema = object({
|
|
@@ -13419,7 +14680,7 @@ const TicketSchema = object({
|
|
|
13419
14680
|
scans: array(TicketScanSchema).meta({ description: "Array of all scan records for this ticket (check-ins and check-outs)" }),
|
|
13420
14681
|
status: TicketStatusEnum.meta({
|
|
13421
14682
|
examples: ["ACTIVE"],
|
|
13422
|
-
description: "Current status of the ticket: ACTIVE (can be used), REDEEMED (already used),
|
|
14683
|
+
description: "Current status of the ticket: ACTIVE (can be used), REDEEMED (already used), CANCELLED (invalidated or refunded)"
|
|
13423
14684
|
}),
|
|
13424
14685
|
attendee: TicketAttendeeSchema.meta({ description: "Attendee information for this ticket - editable by tenant admins" }),
|
|
13425
14686
|
customerId: string$1().meta({
|
|
@@ -13506,11 +14767,10 @@ const TicketListSchema = object({
|
|
|
13506
14767
|
status: _enum([
|
|
13507
14768
|
"ACTIVE",
|
|
13508
14769
|
"REDEEMED",
|
|
13509
|
-
"REFUNDED",
|
|
13510
14770
|
"CANCELLED"
|
|
13511
14771
|
]).optional().meta({
|
|
13512
14772
|
examples: ["ACTIVE"],
|
|
13513
|
-
description: "Filter tickets by status: ACTIVE (can be used), REDEEMED (already used),
|
|
14773
|
+
description: "Filter tickets by status: ACTIVE (can be used), REDEEMED (already used), CANCELLED (invalidated or refunded)"
|
|
13514
14774
|
}),
|
|
13515
14775
|
orderToken: string$1().optional().meta({
|
|
13516
14776
|
examples: [Examples.Order.token],
|
|
@@ -13558,7 +14818,7 @@ const TicketScanCreateSchema = object({
|
|
|
13558
14818
|
|
|
13559
14819
|
//#endregion
|
|
13560
14820
|
//#region ../contract/src/ticket/ticket-update.schema.ts
|
|
13561
|
-
const TicketUpdateStatusEnum = _enum(["ACTIVE", "CANCELLED"]).describe("Status updates allowed via PATCH: ACTIVE (reactivate), CANCELLED (void). REDEEMED is set via scan endpoint
|
|
14821
|
+
const TicketUpdateStatusEnum = _enum(["ACTIVE", "CANCELLED"]).describe("Status updates allowed via PATCH: ACTIVE (reactivate), CANCELLED (void). REDEEMED is set via scan endpoint.");
|
|
13562
14822
|
const TicketUpdateSchema = object({
|
|
13563
14823
|
id: string$1().meta({
|
|
13564
14824
|
examples: [Examples.Ticket.id],
|
|
@@ -13738,14 +14998,15 @@ const VenueGetSchema = object({ key: string$1().meta({
|
|
|
13738
14998
|
|
|
13739
14999
|
//#endregion
|
|
13740
15000
|
//#region ../contract/src/venue/venue-list.schema.ts
|
|
13741
|
-
const limitSchema = () => number().min(1).max(100).prefault(20).meta({ description: "Maximum number of venues to return (1-100, defaults to 20)" });
|
|
15001
|
+
const limitSchema$a = () => number().min(1).max(100).prefault(20).meta({ description: "Maximum number of venues to return (1-100, defaults to 20)" });
|
|
13742
15002
|
const VenueListSchema = object({
|
|
13743
15003
|
teamId: string$1().optional().meta({ description: "Filter venues by owner team ID" }),
|
|
15004
|
+
approval: ApprovalStatusEnum.optional().meta({ description: "Filter venues by approval status. PENDING: awaiting review, APPROVED: can be used for events, REJECTED: cannot be used" }),
|
|
13744
15005
|
query: string$1().optional().meta({ description: "Optional search query for filtering venues by name or slug" }),
|
|
13745
15006
|
latitude: number().min(-90).max(90).optional().meta({ description: "Latitude for location-based search. Must be used with longitude" }),
|
|
13746
15007
|
longitude: number().min(-180).max(180).optional().meta({ description: "Longitude for location-based search. Must be used with latitude" }),
|
|
13747
15008
|
radius: number().min(1).max(2e4).optional().meta({ description: "Search radius in kilometers (1-20000). Requires latitude and longitude" }),
|
|
13748
|
-
limit: limitSchema(),
|
|
15009
|
+
limit: limitSchema$a(),
|
|
13749
15010
|
cursor: string$1().optional().meta({ description: "Pagination cursor from previous response. Used to fetch next page of results" })
|
|
13750
15011
|
}).meta({ description: "Query parameters for listing venues with pagination, filtering, and location-based search" });
|
|
13751
15012
|
|
|
@@ -13784,6 +15045,79 @@ const VenueUpdateSchema = VenueSchema.omit({
|
|
|
13784
15045
|
googlePlaceId: string$1().nullable().optional().meta({ description: "Google Place ID. Pass null to unlink from Google Places, omit to leave unchanged." })
|
|
13785
15046
|
}).meta({ description: "Schema for updating an existing venue. Cannot change teamId (owner). Pass null to clear optional fields." });
|
|
13786
15047
|
|
|
15048
|
+
//#region ../contract/src/ai/suggest-event-tags.schema.ts
|
|
15049
|
+
const SuggestEventTagsInputSchema = object({
|
|
15050
|
+
eventId: string$1().ulid().optional().meta({
|
|
15051
|
+
description: "Event ID for rate limiting and change detection. If provided, suggestions are limited to once per day per event and only if the description changed significantly.",
|
|
15052
|
+
examples: ["evt_01ker4r0rge2xshgd12tytezen"]
|
|
15053
|
+
}),
|
|
15054
|
+
description: string$1().min(100).max(1e4).meta({
|
|
15055
|
+
description: "Event description to analyze for genre and category suggestions. Minimum 100 characters required for meaningful AI analysis.",
|
|
15056
|
+
examples: ["Join us for an all-night warehouse party featuring the best in tech house and melodic techno. BYO drinks, intimate vibes, and a killer sound system."]
|
|
15057
|
+
}),
|
|
15058
|
+
eventName: string$1().optional().meta({
|
|
15059
|
+
description: "Optional event name for additional context",
|
|
15060
|
+
examples: ["Warehouse Sessions Vol. 5"]
|
|
15061
|
+
}),
|
|
15062
|
+
imageUrl: url().optional().meta({
|
|
15063
|
+
description: "Optional event artwork URL for visual analysis (multimodal)",
|
|
15064
|
+
examples: ["https://assets.session.services/events/poster.jpg"]
|
|
15065
|
+
})
|
|
15066
|
+
}).meta({ description: "Input for AI-powered event tag suggestions" });
|
|
15067
|
+
const SuggestEventTagsOutputSchema = object({
|
|
15068
|
+
genres: array(EventGenreEnum).max(5).meta({
|
|
15069
|
+
description: "Suggested music genres based on event description and artwork",
|
|
15070
|
+
examples: [["Tech House", "Melodic Techno"]]
|
|
15071
|
+
}),
|
|
15072
|
+
categories: array(EventCategoryEnum).max(5).meta({
|
|
15073
|
+
description: "Suggested event categories based on description and artwork",
|
|
15074
|
+
examples: [[
|
|
15075
|
+
"Warehouse",
|
|
15076
|
+
"Underground",
|
|
15077
|
+
"BYO"
|
|
15078
|
+
]]
|
|
15079
|
+
}),
|
|
15080
|
+
confidence: number$1().min(0).max(1).meta({
|
|
15081
|
+
description: "AI confidence score for the suggestions (0-1)",
|
|
15082
|
+
examples: [.85]
|
|
15083
|
+
}),
|
|
15084
|
+
startDate: string$1().optional().meta({
|
|
15085
|
+
description: "Event start date/time. Either ISO 8601 format (if specific date found) or natural language hint for relative dates (e.g., 'next Saturday 9pm').",
|
|
15086
|
+
examples: ["2025-02-15T21:00:00", "next Saturday 9pm"]
|
|
15087
|
+
}),
|
|
15088
|
+
endDate: string$1().optional().meta({
|
|
15089
|
+
description: "Event end date/time. Either ISO 8601 format (if specific date found) or natural language hint.",
|
|
15090
|
+
examples: ["2025-02-16T04:00:00", "6am Sunday"]
|
|
15091
|
+
}),
|
|
15092
|
+
venueName: string$1().optional().meta({
|
|
15093
|
+
description: "Venue or location name extracted from the description or artwork. Used to search for and prefill the event location.",
|
|
15094
|
+
examples: ["Warehouse 21", "The Metro Theatre"]
|
|
15095
|
+
}),
|
|
15096
|
+
ticketUrl: url().optional().meta({
|
|
15097
|
+
description: "External ticket purchase URL if found in the description. Only extracted if different from the host platform.",
|
|
15098
|
+
examples: ["https://www.eventbrite.com/e/warehouse-sessions-tickets-123"]
|
|
15099
|
+
})
|
|
15100
|
+
}).meta({ description: "AI-generated genre and category suggestions for an event" });
|
|
15101
|
+
object({
|
|
15102
|
+
estimatedInputTokens: number$1().int().meta({
|
|
15103
|
+
description: "Estimated input tokens for the request",
|
|
15104
|
+
examples: [500]
|
|
15105
|
+
}),
|
|
15106
|
+
estimatedOutputTokens: number$1().int().meta({
|
|
15107
|
+
description: "Estimated output tokens for the response",
|
|
15108
|
+
examples: [100]
|
|
15109
|
+
}),
|
|
15110
|
+
estimatedCostUsd: number$1().meta({
|
|
15111
|
+
description: "Estimated cost in USD",
|
|
15112
|
+
examples: [.002]
|
|
15113
|
+
}),
|
|
15114
|
+
includesImage: boolean$1().meta({
|
|
15115
|
+
description: "Whether the estimate includes image analysis",
|
|
15116
|
+
examples: [true]
|
|
15117
|
+
})
|
|
15118
|
+
}).meta({ description: "Cost estimate for an AI tag suggestion request" });
|
|
15119
|
+
|
|
15120
|
+
//#endregion
|
|
13787
15121
|
//#region ../contract/src/admission/admission.contract.ts
|
|
13788
15122
|
const get$14 = oc.route({
|
|
13789
15123
|
method: "GET",
|
|
@@ -13791,26 +15125,26 @@ const get$14 = oc.route({
|
|
|
13791
15125
|
summary: "Get admission by ID",
|
|
13792
15126
|
tags: ["Admissions"]
|
|
13793
15127
|
}).input(AdmissionGetSchema.strict()).output(AdmissionResponseSchema);
|
|
13794
|
-
const create$
|
|
15128
|
+
const create$14 = oc.route({
|
|
13795
15129
|
method: "POST",
|
|
13796
15130
|
path: "/events/{eventId}/admissions",
|
|
13797
15131
|
summary: "Create a new admission",
|
|
13798
15132
|
tags: ["Admissions"]
|
|
13799
15133
|
}).input(AdmissionCreateSchema.strict()).output(AdmissionResponseSchema);
|
|
13800
|
-
const update$
|
|
15134
|
+
const update$14 = oc.route({
|
|
13801
15135
|
method: "PUT",
|
|
13802
15136
|
path: "/events/{eventId}/admissions/{id}",
|
|
13803
15137
|
summary: "Update an admission",
|
|
13804
15138
|
tags: ["Admissions"]
|
|
13805
15139
|
}).input(AdmissionUpdateSchema.strict()).output(AdmissionResponseSchema);
|
|
13806
|
-
const list$
|
|
15140
|
+
const list$15 = oc.route({
|
|
13807
15141
|
method: "GET",
|
|
13808
15142
|
path: "/events/{eventId}/admissions",
|
|
13809
15143
|
summary: "List admissions",
|
|
13810
15144
|
description: "Returns admissions with cursor-based pagination. Automatically uses search-backed pagination when query parameter is provided for full-text search capabilities.",
|
|
13811
15145
|
tags: ["Admissions"]
|
|
13812
15146
|
}).input(AdmissionListSchema.strict()).output(AdmissionPageSchema);
|
|
13813
|
-
const remove$
|
|
15147
|
+
const remove$13 = oc.route({
|
|
13814
15148
|
method: "DELETE",
|
|
13815
15149
|
path: "/events/{eventId}/admissions/{id}",
|
|
13816
15150
|
summary: "Delete an admission",
|
|
@@ -13824,10 +15158,10 @@ const quote$1 = oc.route({
|
|
|
13824
15158
|
}).input(AdmissionQuoteCreateSchema.strict()).output(AdmissionQuoteResponseSchema);
|
|
13825
15159
|
var admission_contract_default = {
|
|
13826
15160
|
get: get$14,
|
|
13827
|
-
list: list$
|
|
13828
|
-
create: create$
|
|
13829
|
-
update: update$
|
|
13830
|
-
remove: remove$
|
|
15161
|
+
list: list$15,
|
|
15162
|
+
create: create$14,
|
|
15163
|
+
update: update$14,
|
|
15164
|
+
remove: remove$13,
|
|
13831
15165
|
quote: quote$1
|
|
13832
15166
|
};
|
|
13833
15167
|
|
|
@@ -13886,20 +15220,20 @@ const get$13 = oc.route({
|
|
|
13886
15220
|
summary: "Get beneficiary by ID",
|
|
13887
15221
|
tags: ["Beneficiaries"]
|
|
13888
15222
|
}).input(BeneficiaryGetSchema.strict()).output(BeneficiaryResponseSchema);
|
|
13889
|
-
const create$
|
|
15223
|
+
const create$13 = oc.route({
|
|
13890
15224
|
method: "POST",
|
|
13891
15225
|
path: "/beneficiaries",
|
|
13892
15226
|
summary: "Create a new beneficiary",
|
|
13893
15227
|
tags: ["Beneficiaries"]
|
|
13894
15228
|
}).input(BeneficiaryCreateSchema.strict()).output(BeneficiaryResponseSchema);
|
|
13895
|
-
const list$
|
|
15229
|
+
const list$14 = oc.route({
|
|
13896
15230
|
method: "GET",
|
|
13897
15231
|
path: "/beneficiaries",
|
|
13898
15232
|
summary: "List beneficiaries with cursor-based pagination",
|
|
13899
15233
|
description: "Returns beneficiary data with cursor-based pagination and optional full-text search via the `query` parameter.",
|
|
13900
15234
|
tags: ["Beneficiaries"]
|
|
13901
15235
|
}).input(BeneficiaryListSchema.strict()).output(BeneficiaryPageSchema);
|
|
13902
|
-
const remove$
|
|
15236
|
+
const remove$12 = oc.route({
|
|
13903
15237
|
method: "DELETE",
|
|
13904
15238
|
path: "/beneficiaries/{id}",
|
|
13905
15239
|
summary: "Delete a beneficiary",
|
|
@@ -13907,9 +15241,9 @@ const remove$10 = oc.route({
|
|
|
13907
15241
|
}).input(BeneficiaryDeleteSchema.strict()).output(BeneficiaryResponseSchema);
|
|
13908
15242
|
var beneficiary_contract_default = {
|
|
13909
15243
|
get: get$13,
|
|
13910
|
-
list: list$
|
|
13911
|
-
create: create$
|
|
13912
|
-
remove: remove$
|
|
15244
|
+
list: list$14,
|
|
15245
|
+
create: create$13,
|
|
15246
|
+
remove: remove$12
|
|
13913
15247
|
};
|
|
13914
15248
|
|
|
13915
15249
|
//#endregion
|
|
@@ -13920,26 +15254,26 @@ const get$12 = oc.route({
|
|
|
13920
15254
|
summary: "Get coupon code by ID",
|
|
13921
15255
|
tags: ["Coupon Codes"]
|
|
13922
15256
|
}).input(CouponCodeGetSchema.strict()).output(CouponCodeResponseSchema);
|
|
13923
|
-
const create$
|
|
15257
|
+
const create$12 = oc.route({
|
|
13924
15258
|
method: "POST",
|
|
13925
15259
|
path: "/coupon-codes",
|
|
13926
15260
|
summary: "Create a new coupon code",
|
|
13927
15261
|
tags: ["Coupon Codes"]
|
|
13928
15262
|
}).input(CouponCodeCreateSchema.strict()).output(CouponCodeResponseSchema);
|
|
13929
|
-
const update$
|
|
15263
|
+
const update$13 = oc.route({
|
|
13930
15264
|
method: "PUT",
|
|
13931
15265
|
path: "/coupon-codes/{id}",
|
|
13932
15266
|
summary: "Update a coupon code",
|
|
13933
15267
|
tags: ["Coupon Codes"]
|
|
13934
15268
|
}).input(CouponCodeUpdateSchema.strict()).output(CouponCodeResponseSchema);
|
|
13935
|
-
const list$
|
|
15269
|
+
const list$13 = oc.route({
|
|
13936
15270
|
method: "GET",
|
|
13937
15271
|
path: "/coupon-codes",
|
|
13938
15272
|
summary: "List coupon codes with cursor-based pagination",
|
|
13939
15273
|
description: "Returns coupon code data with cursor-based pagination and optional full-text search via the `query` parameter.",
|
|
13940
15274
|
tags: ["Coupon Codes"]
|
|
13941
15275
|
}).input(CouponCodeListSchema.strict()).output(CouponCodePageSchema);
|
|
13942
|
-
const remove$
|
|
15276
|
+
const remove$11 = oc.route({
|
|
13943
15277
|
method: "DELETE",
|
|
13944
15278
|
path: "/coupon-codes/{id}",
|
|
13945
15279
|
summary: "Delete a coupon code",
|
|
@@ -13947,10 +15281,10 @@ const remove$9 = oc.route({
|
|
|
13947
15281
|
}).input(CouponCodeDeleteSchema.strict()).output(CouponCodeResponseSchema);
|
|
13948
15282
|
var coupon_code_contract_default = {
|
|
13949
15283
|
get: get$12,
|
|
13950
|
-
list: list$
|
|
13951
|
-
create: create$
|
|
13952
|
-
update: update$
|
|
13953
|
-
remove: remove$
|
|
15284
|
+
list: list$13,
|
|
15285
|
+
create: create$12,
|
|
15286
|
+
update: update$13,
|
|
15287
|
+
remove: remove$11
|
|
13954
15288
|
};
|
|
13955
15289
|
|
|
13956
15290
|
//#endregion
|
|
@@ -13961,26 +15295,26 @@ const get$11 = oc.route({
|
|
|
13961
15295
|
summary: "Get coupon by ID",
|
|
13962
15296
|
tags: ["Coupons"]
|
|
13963
15297
|
}).input(CouponGetSchema.strict()).output(CouponResponseSchema);
|
|
13964
|
-
const create$
|
|
15298
|
+
const create$11 = oc.route({
|
|
13965
15299
|
method: "POST",
|
|
13966
15300
|
path: "/coupons",
|
|
13967
15301
|
summary: "Create a new coupon",
|
|
13968
15302
|
tags: ["Coupons"]
|
|
13969
15303
|
}).input(CouponCreateSchema.strict()).output(CouponResponseSchema);
|
|
13970
|
-
const update$
|
|
15304
|
+
const update$12 = oc.route({
|
|
13971
15305
|
method: "PUT",
|
|
13972
15306
|
path: "/coupons/{id}",
|
|
13973
15307
|
summary: "Update a coupon",
|
|
13974
15308
|
tags: ["Coupons"]
|
|
13975
15309
|
}).input(CouponUpdateSchema.strict()).output(CouponResponseSchema);
|
|
13976
|
-
const list$
|
|
15310
|
+
const list$12 = oc.route({
|
|
13977
15311
|
method: "GET",
|
|
13978
15312
|
path: "/coupons",
|
|
13979
15313
|
summary: "List coupons with cursor-based pagination",
|
|
13980
15314
|
description: "Returns coupon data with cursor-based pagination and optional full-text search via the `query` parameter.",
|
|
13981
15315
|
tags: ["Coupons"]
|
|
13982
15316
|
}).input(CouponListSchema.strict()).output(CouponPageSchema);
|
|
13983
|
-
const remove$
|
|
15317
|
+
const remove$10 = oc.route({
|
|
13984
15318
|
method: "DELETE",
|
|
13985
15319
|
path: "/coupons/{id}",
|
|
13986
15320
|
summary: "Delete a coupon",
|
|
@@ -13988,13 +15322,98 @@ const remove$8 = oc.route({
|
|
|
13988
15322
|
}).input(CouponDeleteSchema.strict()).output(CouponResponseSchema);
|
|
13989
15323
|
var coupon_contract_default = {
|
|
13990
15324
|
get: get$11,
|
|
13991
|
-
list: list$
|
|
13992
|
-
create: create$
|
|
13993
|
-
update: update$
|
|
13994
|
-
remove: remove$
|
|
15325
|
+
list: list$12,
|
|
15326
|
+
create: create$11,
|
|
15327
|
+
update: update$12,
|
|
15328
|
+
remove: remove$10,
|
|
13995
15329
|
code: coupon_code_contract_default
|
|
13996
15330
|
};
|
|
13997
15331
|
|
|
15332
|
+
//#endregion
|
|
15333
|
+
//#region ../contract/src/ai/ai.contract.ts
|
|
15334
|
+
const suggestTags = oc.route({
|
|
15335
|
+
method: "POST",
|
|
15336
|
+
path: "/events/tags",
|
|
15337
|
+
summary: "Suggest event genres and categories",
|
|
15338
|
+
description: "Uses AI to analyze event description and optional artwork to suggest relevant music genres and event categories. Returns up to 5 genres and 5 categories with a confidence score.",
|
|
15339
|
+
tags: ["Events"]
|
|
15340
|
+
}).input(SuggestEventTagsInputSchema.strict()).output(SuggestEventTagsOutputSchema);
|
|
15341
|
+
var ai_contract_default = { suggestTags };
|
|
15342
|
+
|
|
15343
|
+
//#endregion
|
|
15344
|
+
//#region ../contract/src/event-like/event-like-add.schema.ts
|
|
15345
|
+
/**
|
|
15346
|
+
* Input schema for adding a like to an event.
|
|
15347
|
+
*/
|
|
15348
|
+
const EventLikeAddSchema = object({ eventId: EventIdSchema.meta({ description: "Event to like" }) }).meta({ description: "Request to like an event" });
|
|
15349
|
+
|
|
15350
|
+
//#endregion
|
|
15351
|
+
//#region ../contract/src/event-like/event-like-list.schema.ts
|
|
15352
|
+
const limitSchema = () => number().min(1).max(100).prefault(20).meta({ description: "Maximum number of likes to return (1-100, defaults to 20)" });
|
|
15353
|
+
/**
|
|
15354
|
+
* Input schema for listing the current user's liked events.
|
|
15355
|
+
*/
|
|
15356
|
+
const EventLikeListSchema = object({
|
|
15357
|
+
limit: limitSchema(),
|
|
15358
|
+
cursor: string$1().optional().meta({ description: "Pagination cursor from previous response. Used to fetch next page of results" })
|
|
15359
|
+
}).meta({ description: "Query parameters for listing the current user's liked events with pagination. Returns events sorted by most recently liked first." });
|
|
15360
|
+
|
|
15361
|
+
//#endregion
|
|
15362
|
+
//#region ../contract/src/event-like/event-like.schema.ts
|
|
15363
|
+
/**
|
|
15364
|
+
* Schema for an event like record.
|
|
15365
|
+
* Represents a user's like on an event.
|
|
15366
|
+
*/
|
|
15367
|
+
const EventLikeSchema = object({
|
|
15368
|
+
tenantId: string$1().readonly().meta({ description: "Tenant ID for multi-tenant isolation" }),
|
|
15369
|
+
userId: UserIdSchema.readonly().meta({ description: "User who liked the event" }),
|
|
15370
|
+
eventId: EventIdSchema.meta({ description: "Event the user liked" }),
|
|
15371
|
+
createdAt: datetime().readonly().meta({ description: "Timestamp when the user liked the event" })
|
|
15372
|
+
}).meta({ description: "Represents a user's like on an event. Used for tracking popular events and building personalized recommendations." });
|
|
15373
|
+
|
|
15374
|
+
//#endregion
|
|
15375
|
+
//#region ../contract/src/event-like/event-like-page.schema.ts
|
|
15376
|
+
/**
|
|
15377
|
+
* Paginated response schema for listing event likes.
|
|
15378
|
+
*/
|
|
15379
|
+
const EventLikePageSchema = createPaginatedSchema(EventLikeSchema, "likes").meta({ description: "Paginated list of event likes. Use cursor-based pagination to navigate through results." });
|
|
15380
|
+
|
|
15381
|
+
//#endregion
|
|
15382
|
+
//#region ../contract/src/event-like/event-like-remove.schema.ts
|
|
15383
|
+
/**
|
|
15384
|
+
* Input schema for removing a like from an event.
|
|
15385
|
+
*/
|
|
15386
|
+
const EventLikeRemoveSchema = object({ eventId: EventIdSchema.meta({ description: "Event to remove like from" }) }).meta({ description: "Request to remove the current user's like from an event" });
|
|
15387
|
+
|
|
15388
|
+
//#endregion
|
|
15389
|
+
//#region ../contract/src/event-like/event-like.contract.ts
|
|
15390
|
+
const add = oc.route({
|
|
15391
|
+
method: "POST",
|
|
15392
|
+
path: "/events/{eventId}/like",
|
|
15393
|
+
summary: "Like an event",
|
|
15394
|
+
description: "Like an event as the current user. Atomically increments the event's likes counter.",
|
|
15395
|
+
tags: ["Events"]
|
|
15396
|
+
}).input(EventLikeAddSchema).output(EventLikeSchema);
|
|
15397
|
+
const remove$9 = oc.route({
|
|
15398
|
+
method: "DELETE",
|
|
15399
|
+
path: "/events/{eventId}/like",
|
|
15400
|
+
summary: "Remove like from an event",
|
|
15401
|
+
description: "Remove the current user's like from an event. Atomically decrements the event's likes counter.",
|
|
15402
|
+
tags: ["Events"]
|
|
15403
|
+
}).input(EventLikeRemoveSchema).output(_void());
|
|
15404
|
+
const list$11 = oc.route({
|
|
15405
|
+
method: "GET",
|
|
15406
|
+
path: "/events/likes",
|
|
15407
|
+
summary: "List liked events",
|
|
15408
|
+
description: "List all events the current user has liked, with cursor-based pagination.",
|
|
15409
|
+
tags: ["Events"]
|
|
15410
|
+
}).input(EventLikeListSchema).output(EventLikePageSchema);
|
|
15411
|
+
var event_like_contract_default = {
|
|
15412
|
+
add,
|
|
15413
|
+
remove: remove$9,
|
|
15414
|
+
list: list$11
|
|
15415
|
+
};
|
|
15416
|
+
|
|
13998
15417
|
//#endregion
|
|
13999
15418
|
//#region ../contract/src/event/event-performance.contract.ts
|
|
14000
15419
|
const EventPerformanceCampaignsGetSchema = EventPerformanceCampaignsGetSchema$1.extend({ limit: number().min(1).max(100).optional().default(10) });
|
|
@@ -14131,13 +15550,13 @@ const get$10 = oc.route({
|
|
|
14131
15550
|
description: "Retrieve an event using either its unique ID or URL-friendly slug",
|
|
14132
15551
|
tags: ["Events"]
|
|
14133
15552
|
}).input(EventGetSchema).output(DetailedEventResponseSchema);
|
|
14134
|
-
const create$
|
|
15553
|
+
const create$10 = oc.route({
|
|
14135
15554
|
method: "POST",
|
|
14136
15555
|
path: "/events",
|
|
14137
15556
|
summary: "Create a new event",
|
|
14138
15557
|
tags: ["Events"]
|
|
14139
15558
|
}).input(EventCreateSchema.strict()).output(EventResponseSchema);
|
|
14140
|
-
const update$
|
|
15559
|
+
const update$11 = oc.route({
|
|
14141
15560
|
method: "PUT",
|
|
14142
15561
|
path: "/events/{key}",
|
|
14143
15562
|
summary: "Update an event",
|
|
@@ -14151,20 +15570,30 @@ const list$10 = oc.route({
|
|
|
14151
15570
|
description: "List events with filters for status, approval, visibility, and promoter. Supports full‑text search (query), geo search (latitude/longitude/radius), and cursor-based pagination.",
|
|
14152
15571
|
tags: ["Events"]
|
|
14153
15572
|
}).input(EventListSchema).output(EventPageSchema);
|
|
14154
|
-
const remove$
|
|
15573
|
+
const remove$8 = oc.route({
|
|
14155
15574
|
method: "DELETE",
|
|
14156
15575
|
path: "/events/{key}",
|
|
14157
15576
|
summary: "Delete an event",
|
|
14158
15577
|
description: "Delete an event using either its unique ID or URL-friendly slug",
|
|
14159
15578
|
tags: ["Events"]
|
|
14160
15579
|
}).input(EventDeleteSchema.strict()).output(EventResponseSchema);
|
|
15580
|
+
const feature = oc.route({
|
|
15581
|
+
method: "POST",
|
|
15582
|
+
path: "/events/{key}/feature",
|
|
15583
|
+
summary: "Toggle event featured status",
|
|
15584
|
+
description: "Set or remove featured status on an event. Tenant admin only.",
|
|
15585
|
+
tags: ["Events"]
|
|
15586
|
+
}).input(EventFeatureSchema.strict()).output(EventResponseSchema);
|
|
14161
15587
|
var event_contract_default = {
|
|
14162
15588
|
get: get$10,
|
|
14163
15589
|
list: list$10,
|
|
14164
|
-
create: create$
|
|
14165
|
-
update: update$
|
|
14166
|
-
remove: remove$
|
|
14167
|
-
|
|
15590
|
+
create: create$10,
|
|
15591
|
+
update: update$11,
|
|
15592
|
+
remove: remove$8,
|
|
15593
|
+
feature,
|
|
15594
|
+
like: event_like_contract_default,
|
|
15595
|
+
performance: event_performance_contract_default,
|
|
15596
|
+
tags: ai_contract_default.suggestTags
|
|
14168
15597
|
};
|
|
14169
15598
|
|
|
14170
15599
|
//#endregion
|
|
@@ -14183,7 +15612,7 @@ const list$9 = oc.route({
|
|
|
14183
15612
|
description: "Returns active event collaborations for a specific event with cursor pagination. Only shows accepted collaborators. For pending invitations, use the invite endpoints.",
|
|
14184
15613
|
tags: ["Event Collaborators"]
|
|
14185
15614
|
}).input(EventCollaboratorListSchema.strict()).output(EventCollaboratorPageSchema);
|
|
14186
|
-
const create$
|
|
15615
|
+
const create$9 = oc.route({
|
|
14187
15616
|
method: "POST",
|
|
14188
15617
|
path: "/events/{eventId}/collaborators",
|
|
14189
15618
|
summary: "Invite a promoter to collaborate on an event",
|
|
@@ -14197,7 +15626,7 @@ const accept = oc.route({
|
|
|
14197
15626
|
description: "Accept a pending event collaboration invitation. User must be a member of the invited promoter's team. Deletes the invitation and creates an active collaboration record.",
|
|
14198
15627
|
tags: ["Event Collaborators"]
|
|
14199
15628
|
}).input(AcceptEventCollaboratorSchema.strict()).output(EventCollaboratorSchema);
|
|
14200
|
-
const remove$
|
|
15629
|
+
const remove$7 = oc.route({
|
|
14201
15630
|
method: "DELETE",
|
|
14202
15631
|
path: "/events/{eventId}/collaborators/{id}",
|
|
14203
15632
|
summary: "Remove active event collaboration",
|
|
@@ -14207,25 +15636,13 @@ const remove$6 = oc.route({
|
|
|
14207
15636
|
var event_collaborator_contract_default = {
|
|
14208
15637
|
get: get$9,
|
|
14209
15638
|
list: list$9,
|
|
14210
|
-
create: create$
|
|
15639
|
+
create: create$9,
|
|
14211
15640
|
accept,
|
|
14212
|
-
remove: remove$
|
|
15641
|
+
remove: remove$7
|
|
14213
15642
|
};
|
|
14214
15643
|
|
|
14215
15644
|
//#endregion
|
|
14216
15645
|
//#region ../contract/src/internal/internal.contract.ts
|
|
14217
|
-
const placeAutocomplete = oc.route({
|
|
14218
|
-
method: "GET",
|
|
14219
|
-
path: "/internal/places/autocomplete",
|
|
14220
|
-
summary: "Get place autocomplete suggestions",
|
|
14221
|
-
tags: ["Internal"]
|
|
14222
|
-
}).input(PlaceAutocompleteSchema.strict()).output(PlaceAutocompleteResponseSchema);
|
|
14223
|
-
const placeDetails = oc.route({
|
|
14224
|
-
method: "GET",
|
|
14225
|
-
path: "/internal/places/{placeId}",
|
|
14226
|
-
summary: "Get place details including timezone",
|
|
14227
|
-
tags: ["Internal"]
|
|
14228
|
-
}).input(PlaceDetailsSchema.strict()).output(PlaceDetailsResponseSchema);
|
|
14229
15646
|
const uploadImage = oc.route({
|
|
14230
15647
|
method: "POST",
|
|
14231
15648
|
path: "/internal/upload/image",
|
|
@@ -14233,11 +15650,7 @@ const uploadImage = oc.route({
|
|
|
14233
15650
|
description: "Upload an image file (PNG, JPEG, or SVG), optionally resize it, and compress it for web. SVG files are uploaded as-is without compression. Returns the uploaded image URL and metadata.",
|
|
14234
15651
|
tags: ["Internal"]
|
|
14235
15652
|
}).input(UploadImageRequestSchema.strict()).output(UploadImageResponseSchema);
|
|
14236
|
-
var internal_contract_default = {
|
|
14237
|
-
placeAutocomplete,
|
|
14238
|
-
placeDetails,
|
|
14239
|
-
uploadImage
|
|
14240
|
-
};
|
|
15653
|
+
var internal_contract_default = { uploadImage };
|
|
14241
15654
|
|
|
14242
15655
|
//#endregion
|
|
14243
15656
|
//#region ../contract/src/location/location.contract.ts
|
|
@@ -14262,21 +15675,21 @@ var location_contract_default = {
|
|
|
14262
15675
|
|
|
14263
15676
|
//#endregion
|
|
14264
15677
|
//#region ../contract/src/order/order-note.contract.ts
|
|
14265
|
-
const create$
|
|
15678
|
+
const create$8 = oc.route({
|
|
14266
15679
|
method: "POST",
|
|
14267
15680
|
path: "/orders/{id}/notes",
|
|
14268
15681
|
summary: "Add note to order timeline (promoter only)",
|
|
14269
15682
|
description: "Add a user note to the order timeline. Note will be marked as editable by the author.",
|
|
14270
15683
|
tags: ["Orders"]
|
|
14271
15684
|
}).input(OrderAddNoteSchema.strict()).output(OrderResponseSchema);
|
|
14272
|
-
const update$
|
|
15685
|
+
const update$10 = oc.route({
|
|
14273
15686
|
method: "PATCH",
|
|
14274
15687
|
path: "/orders/{id}/notes/{noteId}",
|
|
14275
15688
|
summary: "Update timeline note (author only)",
|
|
14276
15689
|
description: "Update a timeline note. Only the author can edit their own notes. System-generated entries cannot be edited.",
|
|
14277
15690
|
tags: ["Orders"]
|
|
14278
15691
|
}).input(OrderUpdateNoteSchema.strict()).output(OrderResponseSchema);
|
|
14279
|
-
const remove$
|
|
15692
|
+
const remove$6 = oc.route({
|
|
14280
15693
|
method: "DELETE",
|
|
14281
15694
|
path: "/orders/{id}/notes/{noteId}",
|
|
14282
15695
|
summary: "Delete timeline note (author only)",
|
|
@@ -14284,9 +15697,9 @@ const remove$5 = oc.route({
|
|
|
14284
15697
|
tags: ["Orders"]
|
|
14285
15698
|
}).input(OrderDeleteNoteSchema.strict()).output(_void());
|
|
14286
15699
|
var order_note_contract_default = {
|
|
14287
|
-
create: create$
|
|
14288
|
-
update: update$
|
|
14289
|
-
remove: remove$
|
|
15700
|
+
create: create$8,
|
|
15701
|
+
update: update$10,
|
|
15702
|
+
remove: remove$6
|
|
14290
15703
|
};
|
|
14291
15704
|
|
|
14292
15705
|
//#endregion
|
|
@@ -14310,13 +15723,13 @@ const quote = oc.route({
|
|
|
14310
15723
|
summary: "Create order quote",
|
|
14311
15724
|
tags: ["Orders"]
|
|
14312
15725
|
}).input(OrderQuoteCreateSchema.strict()).output(OrderQuoteResponseSchema);
|
|
14313
|
-
const create$
|
|
15726
|
+
const create$7 = oc.route({
|
|
14314
15727
|
method: "POST",
|
|
14315
15728
|
path: "/orders",
|
|
14316
15729
|
summary: "Create a new order",
|
|
14317
15730
|
tags: ["Orders"]
|
|
14318
15731
|
}).input(OrderCreateSchema.strict()).output(OrderResponseSchema);
|
|
14319
|
-
const update$
|
|
15732
|
+
const update$9 = oc.route({
|
|
14320
15733
|
method: "PUT",
|
|
14321
15734
|
path: "/orders/{id}",
|
|
14322
15735
|
summary: "Update an order",
|
|
@@ -14341,18 +15754,56 @@ const resend = oc.route({
|
|
|
14341
15754
|
description: "Resend order tickets to the customer's email. Optionally provide a different email address.",
|
|
14342
15755
|
tags: ["Orders"]
|
|
14343
15756
|
}).input(OrderResendSchema.strict()).output(OrderResponseSchema);
|
|
15757
|
+
const refund = oc.route({
|
|
15758
|
+
method: "POST",
|
|
15759
|
+
path: "/orders/{id}/refund",
|
|
15760
|
+
summary: "Refund order items",
|
|
15761
|
+
description: "Process a refund for order items. Supports full or partial refunds with optional ticket cancellation.",
|
|
15762
|
+
tags: ["Orders"]
|
|
15763
|
+
}).input(OrderRefundCreateSchema.strict()).output(OrderRefundResponseSchema);
|
|
14344
15764
|
var order_contract_default = {
|
|
14345
15765
|
get: get$7,
|
|
14346
15766
|
list: list$7,
|
|
14347
|
-
create: create$
|
|
14348
|
-
update: update$
|
|
15767
|
+
create: create$7,
|
|
15768
|
+
update: update$9,
|
|
14349
15769
|
quote,
|
|
14350
15770
|
count,
|
|
14351
15771
|
stats: stats$1,
|
|
14352
15772
|
resend,
|
|
15773
|
+
refund,
|
|
14353
15774
|
note: order_note_contract_default
|
|
14354
15775
|
};
|
|
14355
15776
|
|
|
15777
|
+
//#endregion
|
|
15778
|
+
//#region ../contract/src/payout/payout-note.contract.ts
|
|
15779
|
+
const PayoutOnlyResponseSchema = object({ payout: PayoutSchema });
|
|
15780
|
+
const create$6 = oc.route({
|
|
15781
|
+
method: "POST",
|
|
15782
|
+
path: "/payouts/{id}/notes",
|
|
15783
|
+
summary: "Add note to payout timeline (finance permission required)",
|
|
15784
|
+
description: "Add a user note to the payout timeline. Note will be marked as editable by the author.",
|
|
15785
|
+
tags: ["Payouts"]
|
|
15786
|
+
}).input(PayoutAddNoteSchema.strict()).output(PayoutOnlyResponseSchema);
|
|
15787
|
+
const update$8 = oc.route({
|
|
15788
|
+
method: "PATCH",
|
|
15789
|
+
path: "/payouts/{id}/notes/{noteId}",
|
|
15790
|
+
summary: "Update timeline note (author only)",
|
|
15791
|
+
description: "Update a timeline note. Only the author can edit their own notes. System-generated entries cannot be edited.",
|
|
15792
|
+
tags: ["Payouts"]
|
|
15793
|
+
}).input(PayoutUpdateNoteSchema.strict()).output(PayoutOnlyResponseSchema);
|
|
15794
|
+
const remove$5 = oc.route({
|
|
15795
|
+
method: "DELETE",
|
|
15796
|
+
path: "/payouts/{id}/notes/{noteId}",
|
|
15797
|
+
summary: "Delete timeline note (author only)",
|
|
15798
|
+
description: "Delete a timeline note. Only the author can delete their own notes. System-generated entries cannot be deleted.",
|
|
15799
|
+
tags: ["Payouts"]
|
|
15800
|
+
}).input(PayoutDeleteNoteSchema.strict()).output(PayoutOnlyResponseSchema);
|
|
15801
|
+
var payout_note_contract_default = {
|
|
15802
|
+
create: create$6,
|
|
15803
|
+
update: update$8,
|
|
15804
|
+
remove: remove$5
|
|
15805
|
+
};
|
|
15806
|
+
|
|
14356
15807
|
//#endregion
|
|
14357
15808
|
//#region ../contract/src/payout/payout.contract.ts
|
|
14358
15809
|
const get$6 = oc.route({
|
|
@@ -14380,18 +15831,20 @@ const breakdown = oc.route({
|
|
|
14380
15831
|
summary: "Get payout breakdown",
|
|
14381
15832
|
tags: ["Payouts"]
|
|
14382
15833
|
}).input(BreakdownPayoutSchema.strict()).output(PayoutBreakdownSchema);
|
|
14383
|
-
const
|
|
14384
|
-
method: "
|
|
14385
|
-
path: "/payouts/{id}
|
|
14386
|
-
summary: "
|
|
15834
|
+
const update$7 = oc.route({
|
|
15835
|
+
method: "PATCH",
|
|
15836
|
+
path: "/payouts/{id}",
|
|
15837
|
+
summary: "Update a payout",
|
|
15838
|
+
description: "Update payout status or approval. Use approval field to approve or reject payouts.",
|
|
14387
15839
|
tags: ["Payouts"]
|
|
14388
|
-
}).input(
|
|
15840
|
+
}).input(PayoutUpdateSchema.strict()).output(PayoutSchema);
|
|
14389
15841
|
var payout_contract_default = {
|
|
14390
15842
|
get: get$6,
|
|
14391
15843
|
list: list$6,
|
|
14392
15844
|
stats,
|
|
14393
15845
|
breakdown,
|
|
14394
|
-
|
|
15846
|
+
update: update$7,
|
|
15847
|
+
note: payout_note_contract_default
|
|
14395
15848
|
};
|
|
14396
15849
|
|
|
14397
15850
|
//#endregion
|
|
@@ -14789,493 +16242,138 @@ const scan = oc.route({
|
|
|
14789
16242
|
path: "/tickets/{id}/scan",
|
|
14790
16243
|
summary: "Scan a ticket",
|
|
14791
16244
|
tags: ["Tickets"]
|
|
14792
|
-
}).input(TicketScanCreateSchema.strict()).output(TicketResponseSchema);
|
|
14793
|
-
var ticket_contract_default = {
|
|
14794
|
-
get: get$1,
|
|
14795
|
-
list: list$1,
|
|
14796
|
-
create: create$1,
|
|
14797
|
-
update: update$2,
|
|
14798
|
-
scan
|
|
14799
|
-
};
|
|
14800
|
-
|
|
14801
|
-
//#endregion
|
|
14802
|
-
//#region ../contract/src/user/user.contract.ts
|
|
14803
|
-
const me = oc.route({
|
|
14804
|
-
method: "GET",
|
|
14805
|
-
path: "/users/me",
|
|
14806
|
-
summary: "Get the current user and their team memberships",
|
|
14807
|
-
tags: ["Users"]
|
|
14808
|
-
}).output(UserResponseSchema);
|
|
14809
|
-
const UpdateUserInputSchema = object({
|
|
14810
|
-
firstName: string$1().min(1).optional(),
|
|
14811
|
-
lastName: string$1().min(1).optional(),
|
|
14812
|
-
imageUrl: url().optional(),
|
|
14813
|
-
metadata: record(string$1(), JsonValueSchema).optional()
|
|
14814
|
-
}).meta({
|
|
14815
|
-
ref: "UpdateUserInput",
|
|
14816
|
-
description: "Input for updating the current user's profile"
|
|
14817
|
-
});
|
|
14818
|
-
const update$1 = oc.route({
|
|
14819
|
-
method: "PATCH",
|
|
14820
|
-
path: "/users/me",
|
|
14821
|
-
summary: "Update the current user's profile",
|
|
14822
|
-
tags: ["Users"]
|
|
14823
|
-
}).input(UpdateUserInputSchema).output(UserSchema);
|
|
14824
|
-
var user_contract_default = {
|
|
14825
|
-
me,
|
|
14826
|
-
update: update$1
|
|
14827
|
-
};
|
|
14828
|
-
|
|
14829
|
-
//#endregion
|
|
14830
|
-
//#region ../contract/src/venue/venue.contract.ts
|
|
14831
|
-
const get = oc.route({
|
|
14832
|
-
method: "GET",
|
|
14833
|
-
path: "/venues/{key}",
|
|
14834
|
-
summary: "Get venue by ID or slug",
|
|
14835
|
-
description: "Retrieve a venue using its unique ID or slug",
|
|
14836
|
-
tags: ["Venues"]
|
|
14837
|
-
}).input(VenueGetSchema.strict()).output(VenueSchema);
|
|
14838
|
-
const list = oc.route({
|
|
14839
|
-
method: "GET",
|
|
14840
|
-
path: "/venues",
|
|
14841
|
-
summary: "List venues with cursor-based pagination",
|
|
14842
|
-
description: "Returns venues with cursor pagination. Supports filtering by team, location-based search, and text query",
|
|
14843
|
-
tags: ["Venues"]
|
|
14844
|
-
}).input(VenueListSchema.strict()).output(VenuePageSchema);
|
|
14845
|
-
const create = oc.route({
|
|
14846
|
-
method: "POST",
|
|
14847
|
-
path: "/venues",
|
|
14848
|
-
summary: "Create a new venue",
|
|
14849
|
-
description: "Create a new venue. Venue will be owned by the specified team but can be used by all teams for their events",
|
|
14850
|
-
tags: ["Venues"]
|
|
14851
|
-
}).input(VenueCreateSchema.strict()).output(VenueSchema);
|
|
14852
|
-
const update = oc.route({
|
|
14853
|
-
method: "PATCH",
|
|
14854
|
-
path: "/venues/{key}",
|
|
14855
|
-
summary: "Update a venue",
|
|
14856
|
-
description: "Update an existing venue. Cannot change venue ownership (teamId)",
|
|
14857
|
-
tags: ["Venues"]
|
|
14858
|
-
}).input(VenueUpdateSchema.strict()).output(VenueSchema);
|
|
14859
|
-
const remove = oc.route({
|
|
14860
|
-
method: "DELETE",
|
|
14861
|
-
path: "/venues/{key}",
|
|
14862
|
-
summary: "Delete a venue",
|
|
14863
|
-
description: "Soft delete a venue (sets deletedAt timestamp)",
|
|
14864
|
-
tags: ["Venues"]
|
|
14865
|
-
}).input(VenueDeleteSchema.strict()).output(VenueSchema);
|
|
14866
|
-
const linkLocation = oc.route({
|
|
14867
|
-
method: "POST",
|
|
14868
|
-
path: "/venues/{key}/locations",
|
|
14869
|
-
summary: "Link location to venue",
|
|
14870
|
-
description: "Link a location to this venue. Allows the venue to be discovered when users search for this location. A venue can have multiple linked locations (e.g., different addresses, branded names). Requires VENUE permission on the owning team.",
|
|
14871
|
-
tags: ["Venues"]
|
|
14872
|
-
}).input(VenueGetSchema.extend({ locationKey: string$1().meta({
|
|
14873
|
-
description: "Location ID (loc_xxx) or Google Place ID to link to this venue",
|
|
14874
|
-
examples: ["loc_01jps5cgsm7qxvh6watsons0eq", "ChIJP3Sa8ziYEmsRUKgyFmh9AQM"]
|
|
14875
|
-
}) }).strict()).output(VenueSchema);
|
|
14876
|
-
const unlinkLocation = oc.route({
|
|
14877
|
-
method: "DELETE",
|
|
14878
|
-
path: "/venues/{key}/locations/{locationKey}",
|
|
14879
|
-
summary: "Unlink location from venue",
|
|
14880
|
-
description: "Remove a location link from this venue. The location will no longer show this venue's branding. Requires VENUE permission on the owning team.",
|
|
14881
|
-
tags: ["Venues"]
|
|
14882
|
-
}).input(VenueGetSchema.extend({ locationKey: string$1().meta({
|
|
14883
|
-
description: "Location ID (loc_xxx) or Google Place ID to unlink from this venue",
|
|
14884
|
-
examples: ["loc_01jps5cgsm7qxvh6watsons0eq", "ChIJP3Sa8ziYEmsRUKgyFmh9AQM"]
|
|
14885
|
-
}) }).strict()).output(VenueSchema);
|
|
14886
|
-
var venue_contract_default = {
|
|
14887
|
-
get,
|
|
14888
|
-
list,
|
|
14889
|
-
create,
|
|
14890
|
-
update,
|
|
14891
|
-
remove,
|
|
14892
|
-
linkLocation,
|
|
14893
|
-
unlinkLocation
|
|
14894
|
-
};
|
|
14895
|
-
|
|
14896
|
-
//#endregion
|
|
14897
|
-
//#region ../contract/src/contract.ts
|
|
14898
|
-
const contract = {
|
|
14899
|
-
beneficiary: beneficiary_contract_default,
|
|
14900
|
-
section: section_contract_default,
|
|
14901
|
-
event: event_contract_default,
|
|
14902
|
-
eventCollaborator: event_collaborator_contract_default,
|
|
14903
|
-
admission: admission_contract_default,
|
|
14904
|
-
order: order_contract_default,
|
|
14905
|
-
ticket: ticket_contract_default,
|
|
14906
|
-
internal: internal_contract_default,
|
|
14907
|
-
location: location_contract_default,
|
|
14908
|
-
coupon: coupon_contract_default,
|
|
14909
|
-
payout: payout_contract_default,
|
|
14910
|
-
permissionScope: permission_scope_contract_default,
|
|
14911
|
-
promoter: promoter_contract_default,
|
|
14912
|
-
team: team_contract_default,
|
|
14913
|
-
teamInvite: team_invite_contract_default,
|
|
14914
|
-
teamMember: team_member_contract_default,
|
|
14915
|
-
tenant: tenant_contract_default,
|
|
14916
|
-
venue: venue_contract_default,
|
|
14917
|
-
analytics: analytics_contract_default,
|
|
14918
|
-
user: user_contract_default
|
|
14919
|
-
};
|
|
14920
|
-
|
|
14921
|
-
//#region ../contract/src/team-member/team-member-delete.schema.ts
|
|
14922
|
-
object({ id: TeamMemberIdSchema.meta({ description: "Team member ID to delete" }) });
|
|
14923
|
-
|
|
14924
|
-
function toEventIterator(stream, options = {}) {
|
|
14925
|
-
const eventStream = stream?.pipeThrough(new TextDecoderStream()).pipeThrough(new EventDecoderStream());
|
|
14926
|
-
const reader = eventStream?.getReader();
|
|
14927
|
-
let span;
|
|
14928
|
-
let isCancelled = false;
|
|
14929
|
-
return new AsyncIteratorClass(async () => {
|
|
14930
|
-
span ??= startSpan("consume_event_iterator_stream");
|
|
14931
|
-
try {
|
|
14932
|
-
while (true) {
|
|
14933
|
-
if (reader === void 0) {
|
|
14934
|
-
return { done: true, value: void 0 };
|
|
14935
|
-
}
|
|
14936
|
-
const { done, value } = await runInSpanContext(span, () => reader.read());
|
|
14937
|
-
if (done) {
|
|
14938
|
-
if (isCancelled) {
|
|
14939
|
-
throw new AbortError("Stream was cancelled");
|
|
14940
|
-
}
|
|
14941
|
-
return { done: true, value: void 0 };
|
|
14942
|
-
}
|
|
14943
|
-
switch (value.event) {
|
|
14944
|
-
case "message": {
|
|
14945
|
-
let message = parseEmptyableJSON(value.data);
|
|
14946
|
-
if (isTypescriptObject(message)) {
|
|
14947
|
-
message = withEventMeta(message, value);
|
|
14948
|
-
}
|
|
14949
|
-
span?.addEvent("message");
|
|
14950
|
-
return { done: false, value: message };
|
|
14951
|
-
}
|
|
14952
|
-
case "error": {
|
|
14953
|
-
let error = new ErrorEvent({
|
|
14954
|
-
data: parseEmptyableJSON(value.data)
|
|
14955
|
-
});
|
|
14956
|
-
error = withEventMeta(error, value);
|
|
14957
|
-
span?.addEvent("error");
|
|
14958
|
-
throw error;
|
|
14959
|
-
}
|
|
14960
|
-
case "done": {
|
|
14961
|
-
let done2 = parseEmptyableJSON(value.data);
|
|
14962
|
-
if (isTypescriptObject(done2)) {
|
|
14963
|
-
done2 = withEventMeta(done2, value);
|
|
14964
|
-
}
|
|
14965
|
-
span?.addEvent("done");
|
|
14966
|
-
return { done: true, value: done2 };
|
|
14967
|
-
}
|
|
14968
|
-
default: {
|
|
14969
|
-
span?.addEvent("maybe_keepalive");
|
|
14970
|
-
}
|
|
14971
|
-
}
|
|
14972
|
-
}
|
|
14973
|
-
} catch (e) {
|
|
14974
|
-
if (!(e instanceof ErrorEvent)) {
|
|
14975
|
-
setSpanError(span, e, options);
|
|
14976
|
-
}
|
|
14977
|
-
throw e;
|
|
14978
|
-
}
|
|
14979
|
-
}, async (reason) => {
|
|
14980
|
-
try {
|
|
14981
|
-
if (reason !== "next") {
|
|
14982
|
-
isCancelled = true;
|
|
14983
|
-
span?.addEvent("cancelled");
|
|
14984
|
-
}
|
|
14985
|
-
await runInSpanContext(span, () => reader?.cancel());
|
|
14986
|
-
} catch (e) {
|
|
14987
|
-
setSpanError(span, e, options);
|
|
14988
|
-
throw e;
|
|
14989
|
-
} finally {
|
|
14990
|
-
span?.end();
|
|
14991
|
-
}
|
|
14992
|
-
});
|
|
14993
|
-
}
|
|
14994
|
-
function toEventStream(iterator, options = {}) {
|
|
14995
|
-
const keepAliveEnabled = options.eventIteratorKeepAliveEnabled ?? true;
|
|
14996
|
-
const keepAliveInterval = options.eventIteratorKeepAliveInterval ?? 5e3;
|
|
14997
|
-
const keepAliveComment = options.eventIteratorKeepAliveComment ?? "";
|
|
14998
|
-
const initialCommentEnabled = options.eventIteratorInitialCommentEnabled ?? true;
|
|
14999
|
-
const initialComment = options.eventIteratorInitialComment ?? "";
|
|
15000
|
-
let cancelled = false;
|
|
15001
|
-
let timeout;
|
|
15002
|
-
let span;
|
|
15003
|
-
const stream = new ReadableStream({
|
|
15004
|
-
start(controller) {
|
|
15005
|
-
span = startSpan("stream_event_iterator");
|
|
15006
|
-
if (initialCommentEnabled) {
|
|
15007
|
-
controller.enqueue(encodeEventMessage({
|
|
15008
|
-
comments: [initialComment]
|
|
15009
|
-
}));
|
|
15010
|
-
}
|
|
15011
|
-
},
|
|
15012
|
-
async pull(controller) {
|
|
15013
|
-
try {
|
|
15014
|
-
if (keepAliveEnabled) {
|
|
15015
|
-
timeout = setInterval(() => {
|
|
15016
|
-
controller.enqueue(encodeEventMessage({
|
|
15017
|
-
comments: [keepAliveComment]
|
|
15018
|
-
}));
|
|
15019
|
-
span?.addEvent("keepalive");
|
|
15020
|
-
}, keepAliveInterval);
|
|
15021
|
-
}
|
|
15022
|
-
const value = await runInSpanContext(span, () => iterator.next());
|
|
15023
|
-
clearInterval(timeout);
|
|
15024
|
-
if (cancelled) {
|
|
15025
|
-
return;
|
|
15026
|
-
}
|
|
15027
|
-
const meta = getEventMeta(value.value);
|
|
15028
|
-
if (!value.done || value.value !== void 0 || meta !== void 0) {
|
|
15029
|
-
const event = value.done ? "done" : "message";
|
|
15030
|
-
controller.enqueue(encodeEventMessage({
|
|
15031
|
-
...meta,
|
|
15032
|
-
event,
|
|
15033
|
-
data: stringifyJSON(value.value)
|
|
15034
|
-
}));
|
|
15035
|
-
span?.addEvent(event);
|
|
15036
|
-
}
|
|
15037
|
-
if (value.done) {
|
|
15038
|
-
controller.close();
|
|
15039
|
-
span?.end();
|
|
15040
|
-
}
|
|
15041
|
-
} catch (err) {
|
|
15042
|
-
clearInterval(timeout);
|
|
15043
|
-
if (cancelled) {
|
|
15044
|
-
return;
|
|
15045
|
-
}
|
|
15046
|
-
if (err instanceof ErrorEvent) {
|
|
15047
|
-
controller.enqueue(encodeEventMessage({
|
|
15048
|
-
...getEventMeta(err),
|
|
15049
|
-
event: "error",
|
|
15050
|
-
data: stringifyJSON(err.data)
|
|
15051
|
-
}));
|
|
15052
|
-
span?.addEvent("error");
|
|
15053
|
-
controller.close();
|
|
15054
|
-
} else {
|
|
15055
|
-
setSpanError(span, err);
|
|
15056
|
-
controller.error(err);
|
|
15057
|
-
}
|
|
15058
|
-
span?.end();
|
|
15059
|
-
}
|
|
15060
|
-
},
|
|
15061
|
-
async cancel() {
|
|
15062
|
-
try {
|
|
15063
|
-
cancelled = true;
|
|
15064
|
-
clearInterval(timeout);
|
|
15065
|
-
span?.addEvent("cancelled");
|
|
15066
|
-
await runInSpanContext(span, () => iterator.return?.());
|
|
15067
|
-
} catch (e) {
|
|
15068
|
-
setSpanError(span, e);
|
|
15069
|
-
throw e;
|
|
15070
|
-
} finally {
|
|
15071
|
-
span?.end();
|
|
15072
|
-
}
|
|
15073
|
-
}
|
|
15074
|
-
}).pipeThrough(new TextEncoderStream());
|
|
15075
|
-
return stream;
|
|
15076
|
-
}
|
|
15077
|
-
|
|
15078
|
-
function toStandardBody(re, options = {}) {
|
|
15079
|
-
return runWithSpan(
|
|
15080
|
-
{ name: "parse_standard_body", signal: options.signal },
|
|
15081
|
-
async () => {
|
|
15082
|
-
const contentDisposition = re.headers.get("content-disposition");
|
|
15083
|
-
if (typeof contentDisposition === "string") {
|
|
15084
|
-
const fileName = getFilenameFromContentDisposition(contentDisposition) ?? "blob";
|
|
15085
|
-
const blob2 = await re.blob();
|
|
15086
|
-
return new File([blob2], fileName, {
|
|
15087
|
-
type: blob2.type
|
|
15088
|
-
});
|
|
15089
|
-
}
|
|
15090
|
-
const contentType = re.headers.get("content-type");
|
|
15091
|
-
if (!contentType || contentType.startsWith("application/json")) {
|
|
15092
|
-
const text = await re.text();
|
|
15093
|
-
return parseEmptyableJSON(text);
|
|
15094
|
-
}
|
|
15095
|
-
if (contentType.startsWith("multipart/form-data")) {
|
|
15096
|
-
return await re.formData();
|
|
15097
|
-
}
|
|
15098
|
-
if (contentType.startsWith("application/x-www-form-urlencoded")) {
|
|
15099
|
-
const text = await re.text();
|
|
15100
|
-
return new URLSearchParams(text);
|
|
15101
|
-
}
|
|
15102
|
-
if (contentType.startsWith("text/event-stream")) {
|
|
15103
|
-
return toEventIterator(re.body, options);
|
|
15104
|
-
}
|
|
15105
|
-
if (contentType.startsWith("text/plain")) {
|
|
15106
|
-
return await re.text();
|
|
15107
|
-
}
|
|
15108
|
-
const blob = await re.blob();
|
|
15109
|
-
return new File([blob], "blob", {
|
|
15110
|
-
type: blob.type
|
|
15111
|
-
});
|
|
15112
|
-
}
|
|
15113
|
-
);
|
|
15114
|
-
}
|
|
15115
|
-
function toFetchBody(body, headers, options = {}) {
|
|
15116
|
-
const currentContentDisposition = headers.get("content-disposition");
|
|
15117
|
-
headers.delete("content-type");
|
|
15118
|
-
headers.delete("content-disposition");
|
|
15119
|
-
if (body === void 0) {
|
|
15120
|
-
return void 0;
|
|
15121
|
-
}
|
|
15122
|
-
if (body instanceof Blob) {
|
|
15123
|
-
headers.set("content-type", body.type);
|
|
15124
|
-
headers.set("content-length", body.size.toString());
|
|
15125
|
-
headers.set(
|
|
15126
|
-
"content-disposition",
|
|
15127
|
-
currentContentDisposition ?? generateContentDisposition(body instanceof File ? body.name : "blob")
|
|
15128
|
-
);
|
|
15129
|
-
return body;
|
|
15130
|
-
}
|
|
15131
|
-
if (body instanceof FormData) {
|
|
15132
|
-
return body;
|
|
15133
|
-
}
|
|
15134
|
-
if (body instanceof URLSearchParams) {
|
|
15135
|
-
return body;
|
|
15136
|
-
}
|
|
15137
|
-
if (isAsyncIteratorObject(body)) {
|
|
15138
|
-
headers.set("content-type", "text/event-stream");
|
|
15139
|
-
return toEventStream(body, options);
|
|
15140
|
-
}
|
|
15141
|
-
headers.set("content-type", "application/json");
|
|
15142
|
-
return stringifyJSON(body);
|
|
15143
|
-
}
|
|
15144
|
-
|
|
15145
|
-
function toStandardHeaders$1(headers, standardHeaders = {}) {
|
|
15146
|
-
headers.forEach((value, key) => {
|
|
15147
|
-
if (Array.isArray(standardHeaders[key])) {
|
|
15148
|
-
standardHeaders[key].push(value);
|
|
15149
|
-
} else if (standardHeaders[key] !== void 0) {
|
|
15150
|
-
standardHeaders[key] = [standardHeaders[key], value];
|
|
15151
|
-
} else {
|
|
15152
|
-
standardHeaders[key] = value;
|
|
15153
|
-
}
|
|
15154
|
-
});
|
|
15155
|
-
return standardHeaders;
|
|
15156
|
-
}
|
|
15157
|
-
function toFetchHeaders(headers, fetchHeaders = new Headers()) {
|
|
15158
|
-
for (const [key, value] of Object.entries(headers)) {
|
|
15159
|
-
if (Array.isArray(value)) {
|
|
15160
|
-
for (const v of value) {
|
|
15161
|
-
fetchHeaders.append(key, v);
|
|
15162
|
-
}
|
|
15163
|
-
} else if (value !== void 0) {
|
|
15164
|
-
fetchHeaders.append(key, value);
|
|
15165
|
-
}
|
|
15166
|
-
}
|
|
15167
|
-
return fetchHeaders;
|
|
15168
|
-
}
|
|
15169
|
-
function toFetchRequest(request, options = {}) {
|
|
15170
|
-
const headers = toFetchHeaders(request.headers);
|
|
15171
|
-
const body = toFetchBody(request.body, headers, options);
|
|
15172
|
-
return new Request(request.url, {
|
|
15173
|
-
signal: request.signal,
|
|
15174
|
-
method: request.method,
|
|
15175
|
-
headers,
|
|
15176
|
-
body
|
|
15177
|
-
});
|
|
15178
|
-
}
|
|
15179
|
-
function toStandardLazyResponse(response, options = {}) {
|
|
15180
|
-
return {
|
|
15181
|
-
body: once(() => toStandardBody(response, options)),
|
|
15182
|
-
status: response.status,
|
|
15183
|
-
get headers() {
|
|
15184
|
-
const headers = toStandardHeaders$1(response.headers);
|
|
15185
|
-
Object.defineProperty(this, "headers", { value: headers, writable: true });
|
|
15186
|
-
return headers;
|
|
15187
|
-
},
|
|
15188
|
-
set headers(value) {
|
|
15189
|
-
Object.defineProperty(this, "headers", { value, writable: true });
|
|
15190
|
-
}
|
|
15191
|
-
};
|
|
15192
|
-
}
|
|
16245
|
+
}).input(TicketScanCreateSchema.strict()).output(TicketResponseSchema);
|
|
16246
|
+
var ticket_contract_default = {
|
|
16247
|
+
get: get$1,
|
|
16248
|
+
list: list$1,
|
|
16249
|
+
create: create$1,
|
|
16250
|
+
update: update$2,
|
|
16251
|
+
scan
|
|
16252
|
+
};
|
|
15193
16253
|
|
|
15194
|
-
|
|
15195
|
-
|
|
15196
|
-
|
|
15197
|
-
|
|
15198
|
-
|
|
15199
|
-
|
|
15200
|
-
|
|
15201
|
-
|
|
15202
|
-
|
|
15203
|
-
|
|
15204
|
-
|
|
16254
|
+
//#endregion
|
|
16255
|
+
//#region ../contract/src/user/user.contract.ts
|
|
16256
|
+
const me = oc.route({
|
|
16257
|
+
method: "GET",
|
|
16258
|
+
path: "/users/me",
|
|
16259
|
+
summary: "Get the current user and their team memberships",
|
|
16260
|
+
tags: ["Users"]
|
|
16261
|
+
}).output(UserResponseSchema);
|
|
16262
|
+
const UpdateUserInputSchema = object({
|
|
16263
|
+
firstName: string$1().min(1).optional(),
|
|
16264
|
+
lastName: string$1().min(1).optional(),
|
|
16265
|
+
imageUrl: url().optional(),
|
|
16266
|
+
metadata: record(string$1(), JsonValueSchema).optional()
|
|
16267
|
+
}).meta({
|
|
16268
|
+
ref: "UpdateUserInput",
|
|
16269
|
+
description: "Input for updating the current user's profile"
|
|
16270
|
+
});
|
|
16271
|
+
const update$1 = oc.route({
|
|
16272
|
+
method: "PATCH",
|
|
16273
|
+
path: "/users/me",
|
|
16274
|
+
summary: "Update the current user's profile",
|
|
16275
|
+
tags: ["Users"]
|
|
16276
|
+
}).input(UpdateUserInputSchema).output(UserSchema);
|
|
16277
|
+
var user_contract_default = {
|
|
16278
|
+
me,
|
|
16279
|
+
update: update$1
|
|
16280
|
+
};
|
|
15205
16281
|
|
|
15206
|
-
|
|
15207
|
-
|
|
15208
|
-
|
|
15209
|
-
|
|
15210
|
-
|
|
15211
|
-
|
|
15212
|
-
|
|
15213
|
-
|
|
15214
|
-
|
|
15215
|
-
|
|
15216
|
-
|
|
15217
|
-
|
|
15218
|
-
|
|
15219
|
-
|
|
15220
|
-
|
|
15221
|
-
|
|
15222
|
-
|
|
15223
|
-
|
|
15224
|
-
|
|
15225
|
-
|
|
15226
|
-
|
|
15227
|
-
|
|
15228
|
-
|
|
15229
|
-
|
|
15230
|
-
|
|
15231
|
-
|
|
15232
|
-
|
|
15233
|
-
|
|
15234
|
-
|
|
15235
|
-
|
|
15236
|
-
|
|
15237
|
-
|
|
15238
|
-
|
|
15239
|
-
|
|
15240
|
-
|
|
15241
|
-
|
|
15242
|
-
|
|
15243
|
-
|
|
15244
|
-
|
|
15245
|
-
|
|
15246
|
-
|
|
15247
|
-
|
|
15248
|
-
|
|
15249
|
-
|
|
15250
|
-
|
|
15251
|
-
|
|
15252
|
-
|
|
15253
|
-
|
|
15254
|
-
|
|
15255
|
-
|
|
15256
|
-
|
|
15257
|
-
|
|
15258
|
-
|
|
15259
|
-
|
|
15260
|
-
|
|
15261
|
-
|
|
15262
|
-
|
|
15263
|
-
|
|
15264
|
-
|
|
15265
|
-
|
|
16282
|
+
//#endregion
|
|
16283
|
+
//#region ../contract/src/venue/venue.contract.ts
|
|
16284
|
+
const get = oc.route({
|
|
16285
|
+
method: "GET",
|
|
16286
|
+
path: "/venues/{key}",
|
|
16287
|
+
summary: "Get venue by ID or slug",
|
|
16288
|
+
description: "Retrieve a venue using its unique ID or slug",
|
|
16289
|
+
tags: ["Venues"]
|
|
16290
|
+
}).input(VenueGetSchema.strict()).output(VenueSchema);
|
|
16291
|
+
const list = oc.route({
|
|
16292
|
+
method: "GET",
|
|
16293
|
+
path: "/venues",
|
|
16294
|
+
summary: "List venues with cursor-based pagination",
|
|
16295
|
+
description: "Returns venues with cursor pagination. Supports filtering by team, location-based search, and text query",
|
|
16296
|
+
tags: ["Venues"]
|
|
16297
|
+
}).input(VenueListSchema.strict()).output(VenuePageSchema);
|
|
16298
|
+
const create = oc.route({
|
|
16299
|
+
method: "POST",
|
|
16300
|
+
path: "/venues",
|
|
16301
|
+
summary: "Create a new venue",
|
|
16302
|
+
description: "Create a new venue. Venue will be owned by the specified team but can be used by all teams for their events",
|
|
16303
|
+
tags: ["Venues"]
|
|
16304
|
+
}).input(VenueCreateSchema.strict()).output(VenueSchema);
|
|
16305
|
+
const update = oc.route({
|
|
16306
|
+
method: "PATCH",
|
|
16307
|
+
path: "/venues/{key}",
|
|
16308
|
+
summary: "Update a venue",
|
|
16309
|
+
description: "Update an existing venue. Cannot change venue ownership (teamId)",
|
|
16310
|
+
tags: ["Venues"]
|
|
16311
|
+
}).input(VenueUpdateSchema.strict()).output(VenueSchema);
|
|
16312
|
+
const remove = oc.route({
|
|
16313
|
+
method: "DELETE",
|
|
16314
|
+
path: "/venues/{key}",
|
|
16315
|
+
summary: "Delete a venue",
|
|
16316
|
+
description: "Soft delete a venue (sets deletedAt timestamp)",
|
|
16317
|
+
tags: ["Venues"]
|
|
16318
|
+
}).input(VenueDeleteSchema.strict()).output(VenueSchema);
|
|
16319
|
+
const linkLocation = oc.route({
|
|
16320
|
+
method: "POST",
|
|
16321
|
+
path: "/venues/{key}/locations",
|
|
16322
|
+
summary: "Link location to venue",
|
|
16323
|
+
description: "Link a location to this venue. Allows the venue to be discovered when users search for this location. A venue can have multiple linked locations (e.g., different addresses, branded names). Requires VENUE permission on the owning team.",
|
|
16324
|
+
tags: ["Venues"]
|
|
16325
|
+
}).input(VenueGetSchema.extend({ locationKey: string$1().meta({
|
|
16326
|
+
description: "Location ID (loc_xxx) or Google Place ID to link to this venue",
|
|
16327
|
+
examples: ["loc_01jps5cgsm7qxvh6watsons0eq", "ChIJP3Sa8ziYEmsRUKgyFmh9AQM"]
|
|
16328
|
+
}) }).strict()).output(VenueSchema);
|
|
16329
|
+
const unlinkLocation = oc.route({
|
|
16330
|
+
method: "DELETE",
|
|
16331
|
+
path: "/venues/{key}/locations/{locationKey}",
|
|
16332
|
+
summary: "Unlink location from venue",
|
|
16333
|
+
description: "Remove a location link from this venue. The location will no longer show this venue's branding. Requires VENUE permission on the owning team.",
|
|
16334
|
+
tags: ["Venues"]
|
|
16335
|
+
}).input(VenueGetSchema.extend({ locationKey: string$1().meta({
|
|
16336
|
+
description: "Location ID (loc_xxx) or Google Place ID to unlink from this venue",
|
|
16337
|
+
examples: ["loc_01jps5cgsm7qxvh6watsons0eq", "ChIJP3Sa8ziYEmsRUKgyFmh9AQM"]
|
|
16338
|
+
}) }).strict()).output(VenueSchema);
|
|
16339
|
+
var venue_contract_default = {
|
|
16340
|
+
get,
|
|
16341
|
+
list,
|
|
16342
|
+
create,
|
|
16343
|
+
update,
|
|
16344
|
+
remove,
|
|
16345
|
+
linkLocation,
|
|
16346
|
+
unlinkLocation
|
|
16347
|
+
};
|
|
15266
16348
|
|
|
15267
|
-
|
|
15268
|
-
|
|
15269
|
-
|
|
15270
|
-
|
|
15271
|
-
|
|
15272
|
-
|
|
15273
|
-
|
|
15274
|
-
|
|
15275
|
-
|
|
15276
|
-
|
|
15277
|
-
|
|
15278
|
-
|
|
16349
|
+
//#endregion
|
|
16350
|
+
//#region ../contract/src/contract.ts
|
|
16351
|
+
const contract = {
|
|
16352
|
+
analytics: analytics_contract_default,
|
|
16353
|
+
beneficiary: beneficiary_contract_default,
|
|
16354
|
+
section: section_contract_default,
|
|
16355
|
+
event: event_contract_default,
|
|
16356
|
+
eventCollaborator: event_collaborator_contract_default,
|
|
16357
|
+
admission: admission_contract_default,
|
|
16358
|
+
order: order_contract_default,
|
|
16359
|
+
ticket: ticket_contract_default,
|
|
16360
|
+
internal: internal_contract_default,
|
|
16361
|
+
location: location_contract_default,
|
|
16362
|
+
coupon: coupon_contract_default,
|
|
16363
|
+
payout: payout_contract_default,
|
|
16364
|
+
permissionScope: permission_scope_contract_default,
|
|
16365
|
+
promoter: promoter_contract_default,
|
|
16366
|
+
team: team_contract_default,
|
|
16367
|
+
teamInvite: team_invite_contract_default,
|
|
16368
|
+
teamPayment: team_payment_contract_default,
|
|
16369
|
+
teamMember: team_member_contract_default,
|
|
16370
|
+
tenant: tenant_contract_default,
|
|
16371
|
+
venue: venue_contract_default,
|
|
16372
|
+
user: user_contract_default
|
|
16373
|
+
};
|
|
16374
|
+
|
|
16375
|
+
//#region ../contract/src/team-member/team-member-delete.schema.ts
|
|
16376
|
+
object({ id: TeamMemberIdSchema.meta({ description: "Team member ID to delete" }) });
|
|
15279
16377
|
|
|
15280
16378
|
class CompositeLinkFetchPlugin extends CompositeStandardLinkPlugin {
|
|
15281
16379
|
initRuntimeAdapter(options) {
|
|
@@ -17533,6 +18631,7 @@ function createGTMDestination(debug = false) {
|
|
|
17533
18631
|
|
|
17534
18632
|
//#endregion
|
|
17535
18633
|
//#region src/analytics/destinations/sessions.ts
|
|
18634
|
+
const VALID_EVENT_TYPES = new Set(Object.values(TrackingEventType));
|
|
17536
18635
|
function buildTrackingContext(event) {
|
|
17537
18636
|
return {
|
|
17538
18637
|
session_id: event.sessionId,
|
|
@@ -17562,7 +18661,7 @@ function extractRequiredFields(properties) {
|
|
|
17562
18661
|
};
|
|
17563
18662
|
}
|
|
17564
18663
|
function createSessionsDestination(client, debug = false) {
|
|
17565
|
-
const sendTrackingEvent = async (method, event,
|
|
18664
|
+
const sendTrackingEvent = async (method, event, fixedEventType) => {
|
|
17566
18665
|
const { eventId, teamId, promoterId, rest } = extractRequiredFields(event.properties);
|
|
17567
18666
|
if (!eventId || !teamId || !promoterId) {
|
|
17568
18667
|
if (debug) console.warn(`[Sessions API] Missing required fields, skipping ${method}:`, {
|
|
@@ -17572,19 +18671,27 @@ function createSessionsDestination(client, debug = false) {
|
|
|
17572
18671
|
});
|
|
17573
18672
|
return;
|
|
17574
18673
|
}
|
|
18674
|
+
const eventType = fixedEventType ?? event.name;
|
|
18675
|
+
if (!eventType || !VALID_EVENT_TYPES.has(eventType)) {
|
|
18676
|
+
if (debug) console.warn(`[Sessions API] Invalid or missing eventType "${eventType}", skipping ${method}`);
|
|
18677
|
+
return;
|
|
18678
|
+
}
|
|
17575
18679
|
const payload = {
|
|
17576
18680
|
eventId,
|
|
17577
18681
|
teamId,
|
|
17578
18682
|
promoterId,
|
|
17579
|
-
eventType
|
|
17580
|
-
properties:
|
|
18683
|
+
eventType,
|
|
18684
|
+
properties: fixedEventType && event.name ? {
|
|
18685
|
+
...rest,
|
|
18686
|
+
name: event.name
|
|
18687
|
+
} : rest,
|
|
17581
18688
|
context: buildTrackingContext(event)
|
|
17582
18689
|
};
|
|
17583
18690
|
if (debug) console.log(`[Sessions API] Sending ${method}:`, payload);
|
|
17584
18691
|
await client.analytics[method](payload);
|
|
17585
18692
|
};
|
|
17586
18693
|
const track = (event, _config) => {
|
|
17587
|
-
sendTrackingEvent("track", event
|
|
18694
|
+
sendTrackingEvent("track", event).catch((error) => {
|
|
17588
18695
|
if (debug) console.error("[Sessions API] track error:", error);
|
|
17589
18696
|
});
|
|
17590
18697
|
};
|
|
@@ -17837,7 +18944,11 @@ function createDestinationManager(client, debug = false) {
|
|
|
17837
18944
|
};
|
|
17838
18945
|
const sendEvent = async (event, promoterId) => {
|
|
17839
18946
|
const config = await getPromoterConfig(promoterId);
|
|
17840
|
-
|
|
18947
|
+
try {
|
|
18948
|
+
sendToDestination(sessionsDestination, event, config);
|
|
18949
|
+
} catch (error) {
|
|
18950
|
+
if (debug) console.error(`[DestinationManager] ${sessionsDestination.name} error:`, error);
|
|
18951
|
+
}
|
|
17841
18952
|
if (config.fbId || config.gtmId || config.tikTokId) for (const dest of thirdPartyDestinations) try {
|
|
17842
18953
|
sendToDestination(dest, event, config);
|
|
17843
18954
|
} catch (error) {
|
|
@@ -17926,39 +19037,125 @@ function resetSession() {
|
|
|
17926
19037
|
|
|
17927
19038
|
//#endregion
|
|
17928
19039
|
//#region src/analytics/format-price.ts
|
|
19040
|
+
/**
|
|
19041
|
+
* Currency data with locale and minor unit exponent (ISO 4217).
|
|
19042
|
+
* Exponent: 0 = no minor units (JPY, KRW), 2 = cents (most), 3 = fils (KWD, etc.)
|
|
19043
|
+
*/
|
|
17929
19044
|
const currencies = {
|
|
17930
|
-
AUD: {
|
|
17931
|
-
|
|
17932
|
-
|
|
17933
|
-
|
|
17934
|
-
|
|
17935
|
-
|
|
17936
|
-
|
|
17937
|
-
|
|
17938
|
-
|
|
17939
|
-
|
|
17940
|
-
|
|
17941
|
-
|
|
17942
|
-
|
|
17943
|
-
|
|
17944
|
-
|
|
17945
|
-
|
|
17946
|
-
|
|
17947
|
-
|
|
17948
|
-
|
|
17949
|
-
|
|
17950
|
-
|
|
17951
|
-
|
|
17952
|
-
|
|
17953
|
-
|
|
17954
|
-
|
|
19045
|
+
AUD: {
|
|
19046
|
+
locale: "en-AU",
|
|
19047
|
+
exponent: 2
|
|
19048
|
+
},
|
|
19049
|
+
NZD: {
|
|
19050
|
+
locale: "en-NZ",
|
|
19051
|
+
exponent: 2
|
|
19052
|
+
},
|
|
19053
|
+
GBP: {
|
|
19054
|
+
locale: "en-GB",
|
|
19055
|
+
exponent: 2
|
|
19056
|
+
},
|
|
19057
|
+
USD: {
|
|
19058
|
+
locale: "en-US",
|
|
19059
|
+
exponent: 2
|
|
19060
|
+
},
|
|
19061
|
+
EUR: {
|
|
19062
|
+
locale: "de-DE",
|
|
19063
|
+
exponent: 2
|
|
19064
|
+
},
|
|
19065
|
+
CAD: {
|
|
19066
|
+
locale: "en-CA",
|
|
19067
|
+
exponent: 2
|
|
19068
|
+
},
|
|
19069
|
+
CHF: {
|
|
19070
|
+
locale: "de-CH",
|
|
19071
|
+
exponent: 2
|
|
19072
|
+
},
|
|
19073
|
+
CNY: {
|
|
19074
|
+
locale: "zh-CN",
|
|
19075
|
+
exponent: 2
|
|
19076
|
+
},
|
|
19077
|
+
HKD: {
|
|
19078
|
+
locale: "zh-HK",
|
|
19079
|
+
exponent: 2
|
|
19080
|
+
},
|
|
19081
|
+
SGD: {
|
|
19082
|
+
locale: "en-SG",
|
|
19083
|
+
exponent: 2
|
|
19084
|
+
},
|
|
19085
|
+
INR: {
|
|
19086
|
+
locale: "en-IN",
|
|
19087
|
+
exponent: 2
|
|
19088
|
+
},
|
|
19089
|
+
MXN: {
|
|
19090
|
+
locale: "es-MX",
|
|
19091
|
+
exponent: 2
|
|
19092
|
+
},
|
|
19093
|
+
BRL: {
|
|
19094
|
+
locale: "pt-BR",
|
|
19095
|
+
exponent: 2
|
|
19096
|
+
},
|
|
19097
|
+
ZAR: {
|
|
19098
|
+
locale: "en-ZA",
|
|
19099
|
+
exponent: 2
|
|
19100
|
+
},
|
|
19101
|
+
SEK: {
|
|
19102
|
+
locale: "sv-SE",
|
|
19103
|
+
exponent: 2
|
|
19104
|
+
},
|
|
19105
|
+
NOK: {
|
|
19106
|
+
locale: "nb-NO",
|
|
19107
|
+
exponent: 2
|
|
19108
|
+
},
|
|
19109
|
+
DKK: {
|
|
19110
|
+
locale: "da-DK",
|
|
19111
|
+
exponent: 2
|
|
19112
|
+
},
|
|
19113
|
+
PLN: {
|
|
19114
|
+
locale: "pl-PL",
|
|
19115
|
+
exponent: 2
|
|
19116
|
+
},
|
|
19117
|
+
CZK: {
|
|
19118
|
+
locale: "cs-CZ",
|
|
19119
|
+
exponent: 2
|
|
19120
|
+
},
|
|
19121
|
+
HUF: {
|
|
19122
|
+
locale: "hu-HU",
|
|
19123
|
+
exponent: 2
|
|
19124
|
+
},
|
|
19125
|
+
RON: {
|
|
19126
|
+
locale: "ro-RO",
|
|
19127
|
+
exponent: 2
|
|
19128
|
+
},
|
|
19129
|
+
THB: {
|
|
19130
|
+
locale: "th-TH",
|
|
19131
|
+
exponent: 2
|
|
19132
|
+
},
|
|
19133
|
+
ILS: {
|
|
19134
|
+
locale: "he-IL",
|
|
19135
|
+
exponent: 2
|
|
19136
|
+
},
|
|
19137
|
+
JPY: {
|
|
19138
|
+
locale: "ja-JP",
|
|
19139
|
+
exponent: 0
|
|
19140
|
+
},
|
|
19141
|
+
KRW: {
|
|
19142
|
+
locale: "ko-KR",
|
|
19143
|
+
exponent: 0
|
|
19144
|
+
}
|
|
17955
19145
|
};
|
|
17956
|
-
|
|
17957
|
-
|
|
19146
|
+
/**
|
|
19147
|
+
* Format a price for display.
|
|
19148
|
+
* @param minorUnits - Amount in minor currency units (cents, yen, etc.)
|
|
19149
|
+
* @param currency - ISO 4217 currency code
|
|
19150
|
+
*/
|
|
19151
|
+
function formatPrice(minorUnits, currency) {
|
|
19152
|
+
const currencyData = currencies[currency];
|
|
19153
|
+
const locale = currencyData?.locale ?? "en-US";
|
|
19154
|
+
const divisor = 10 ** (currencyData?.exponent ?? 2);
|
|
17958
19155
|
return new Intl.NumberFormat(locale, {
|
|
17959
19156
|
style: "currency",
|
|
17960
19157
|
currency
|
|
17961
|
-
}).format(
|
|
19158
|
+
}).format(minorUnits / divisor);
|
|
17962
19159
|
}
|
|
17963
19160
|
|
|
17964
19161
|
//#endregion
|
|
@@ -18069,15 +19266,17 @@ function createAnalytics(config) {
|
|
|
18069
19266
|
};
|
|
18070
19267
|
}
|
|
18071
19268
|
|
|
18072
|
-
const sessionServicesTicketingCss = () => `:host{--background:transparent;--foreground:oklch(0.145 0 0);--card:oklch(1 0 0);--card-foreground:oklch(0.145 0 0);--popover:oklch(1 0 0);--popover-foreground:oklch(0.145 0 0);--primary:oklch(0.205 0 0);--primary-foreground:oklch(0.985 0 0);--secondary:oklch(0.97 0 0);--secondary-foreground:oklch(0.205 0 0);--muted:oklch(0.97 0 0);--muted-foreground:oklch(0.556 0 0);--accent:oklch(0.97 0 0);--accent-foreground:oklch(0.205 0 0);--destructive:oklch(0.577 0.245 27.325);--destructive-foreground:oklch(1 0 0);--border:oklch(0.922 0 0);--input:oklch(0.922 0 0);--ring:oklch(0.708 0 0);--success:oklch(0.66 0.154 149.48);--warning:oklch(0.72 0.153 66.34);--radius:0.625rem;--spacing-xs:0.25rem;--spacing-sm:0.5rem;--spacing-md:1rem;--spacing-lg:1.5rem;--spacing-xl:2rem;--font-family:ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
|
|
18073
|
-
Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;--font-size-xs:0.75rem;--font-size-sm:0.875rem;--font-size-base:1rem;--font-size-lg:1.125rem;--font-size-xl:1.25rem;--font-size-2xl:1.5rem;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--shadow-sm:0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);--shadow-base:0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);--shadow-md:0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1);--shadow-lg:0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1);--shadow-xl:0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1);--transition-fast:150ms cubic-bezier(0.4, 0, 0.2, 1);--transition-base:200ms cubic-bezier(0.4, 0, 0.2, 1);--transition-slow:300ms cubic-bezier(0.4, 0, 0.2, 1);--internal-background:var(--background, transparent);--internal-foreground:var(--foreground, oklch(0.145 0 0));--internal-card:var(--card, oklch(1 0 0));--internal-card-foreground:var(--card-foreground, oklch(0.145 0 0));--internal-popover:var(--popover, oklch(1 0 0));--internal-popover-foreground:var(--popover-foreground, oklch(0.145 0 0));--internal-primary:var(--primary, oklch(0.205 0 0));--internal-primary-foreground:var(--primary-foreground, oklch(0.985 0 0));--internal-secondary:var(--secondary, oklch(0.97 0 0));--internal-secondary-foreground:var(--secondary-foreground, oklch(0.205 0 0));--internal-muted:var(--muted, oklch(0.97 0 0));--internal-muted-foreground:var(--muted-foreground, oklch(0.556 0 0));--internal-accent:var(--accent, oklch(0.97 0 0));--internal-accent-foreground:var(--accent-foreground, oklch(0.205 0 0));--internal-destructive:var(--destructive, oklch(0.577 0.245 27.325));--internal-destructive-foreground:var(--destructive-foreground, oklch(1 0 0));--internal-border:var(--border, oklch(0.922 0 0));--internal-input:var(--input, oklch(0.922 0 0));--internal-ring:var(--ring, oklch(0.708 0 0));--internal-success:var(--success, oklch(0.66 0.154 149.48));--internal-warning:var(--warning, oklch(0.72 0.153 66.34));--internal-radius:var(--radius, 0.625rem);--internal-spacing-xs:var(--spacing-xs, 0.25rem);--internal-spacing-sm:var(--spacing-sm, 0.5rem);--internal-spacing-md:var(--spacing-md, 1rem);--internal-spacing-lg:var(--spacing-lg, 1.5rem);--internal-spacing-xl:var(--spacing-xl, 2rem);--internal-font-family:var(--font-family, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif);--internal-font-size-xs:var(--font-size-xs, 0.75rem);--internal-font-size-sm:var(--font-size-sm, 0.875rem);--internal-font-size-base:var(--font-size-base, 1rem);--internal-font-size-lg:var(--font-size-lg, 1.125rem);--internal-font-size-xl:var(--font-size-xl, 1.25rem);--internal-font-size-2xl:var(--font-size-2xl, 1.5rem);--internal-font-weight-normal:var(--font-weight-normal, 400);--internal-font-weight-medium:var(--font-weight-medium, 500);--internal-font-weight-semibold:var(--font-weight-semibold, 600);--internal-font-weight-bold:var(--font-weight-bold, 700);--internal-shadow-sm:var(--shadow-sm, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1));--internal-shadow-base:var(--shadow-base, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1));--internal-shadow-md:var(--shadow-md, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1));--internal-shadow-lg:var(--shadow-lg, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1));--internal-shadow-xl:var(--shadow-xl, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1));--internal-transition-fast:var(--transition-fast, 150ms cubic-bezier(0.4, 0, 0.2, 1));--internal-transition-base:var(--transition-base, 200ms cubic-bezier(0.4, 0, 0.2, 1));--internal-transition-slow:var(--transition-slow, 300ms cubic-bezier(0.4, 0, 0.2, 1));display:block;font-family:var(--internal-font-family);color:var(--internal-foreground);background:var(--internal-background)}*{box-sizing:border-box;margin:0;padding:0}*:focus{outline:none}*:focus-visible{outline:2px solid var(--internal-ring);outline-offset:2px;border-radius:calc(var(--internal-radius) - 4px)}.session-services-ticketing-container{width:100%;max-width:100%;margin:0}:host([data-theme="dark"]){--background:transparent;--foreground:oklch(0.96 0 0);--card:oklch(0.17 0 0);--card-foreground:oklch(0.96 0 0);--popover:oklch(0.17 0 0);--popover-foreground:oklch(0.96 0 0);--primary:oklch(0.78 0 0);--primary-foreground:oklch(0.14 0 0);--secondary:oklch(0.22 0 0);--secondary-foreground:oklch(0.96 0 0);--muted:oklch(0.22 0 0);--muted-foreground:oklch(0.78 0 0);--accent:oklch(0.22 0 0);--accent-foreground:oklch(0.96 0 0);--destructive:oklch(0.577 0.245 27.325);--destructive-foreground:oklch(1 0 0);--border:oklch(0.29 0 0);--input:oklch(0.29 0 0);--ring:oklch(0.60 0 0)}.tickets-wrapper{padding:0;width:100%}.unsectioned-admissions{width:100%}.unsectioned-admissions .ticket-section{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);margin:0 0 var(--spacing-lg) 0;overflow:hidden;width:100%;box-shadow:var(--shadow-sm);transition:box-shadow var(--transition-base)}.unsectioned-admissions .ticket-section:hover{box-shadow:var(--shadow-sm)}.unsectioned-admissions .admission-card{border-radius:var(--radius);border:none}.unsectioned-admissions .admission-card:first-child{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}.unsectioned-admissions .admission-card:last-child{border-bottom-left-radius:var(--radius);border-bottom-right-radius:var(--radius)}.ticket-section{background:var(--internal-card);border:1px solid var(--internal-border);border-radius:var(--internal-radius);margin:0 0 var(--internal-spacing-lg) 0;overflow:hidden;width:100%;box-shadow:var(--internal-shadow-sm);transition:all var(--internal-transition-base)}.ticket-section:focus-within{box-shadow:var(--internal-shadow-md)}.ticket-section:hover:not(.section-sold-out){box-shadow:var(--internal-shadow-md)}.ticket-section.section-sold-out{opacity:1;background:var(--card);box-shadow:none;position:relative;border-color:var(--border);overflow:hidden}.ticket-section.section-sold-out .section-header{background:transparent;padding-bottom:var(--spacing-md)}.ticket-section.section-sold-out .section-name,.ticket-section.section-sold-out .section-time,.ticket-section.section-sold-out .section-venue{opacity:0.8}.ticket-section.section-sold-out .admissions-list{opacity:0.6;pointer-events:none;filter:grayscale(0.3)}.ticket-section.section-sold-out .admission-card{background:var(--card)}.ticket-section.section-sold-out .quantity-controls,.ticket-section.section-sold-out .sold-out-controls{opacity:0.7}.section-header{padding:var(--internal-spacing-md) var(--internal-spacing-lg);border-bottom:1px solid var(--internal-border);background:var(--internal-card)}.section-name{color:var(--internal-foreground);font-size:var(--internal-font-size-lg);font-weight:var(--internal-font-weight-semibold);letter-spacing:-0.025em;margin:0 0 var(--internal-spacing-xs) 0;display:flex;align-items:center;gap:var(--internal-spacing-sm)}.section-time{color:var(--internal-muted-foreground);font-size:var(--internal-font-size-sm);margin-bottom:var(--internal-spacing-xs);display:flex;align-items:center;gap:var(--internal-spacing-xs)}.section-time svg{width:calc(var(--spacing-sm) + var(--spacing-xs));height:calc(var(--spacing-sm) + var(--spacing-xs));flex-shrink:0;opacity:0.8}.section-venue{color:var(--muted-foreground);font-size:var(--font-size-sm);display:flex;align-items:center;gap:var(--spacing-xs)}.section-venue svg{width:calc(var(--spacing-sm) + var(--spacing-xs));height:calc(var(--spacing-sm) + var(--spacing-xs));flex-shrink:0;opacity:0.8}.admissions-list{padding:0}.admission-card{border-bottom:1px solid var(--internal-border);padding:var(--internal-spacing-md) var(--internal-spacing-lg);position:relative;transition:background-color var(--internal-transition-base);cursor:default}.admission-card:focus-visible{outline:2px solid var(--internal-ring);outline-offset:-2px;z-index:1}.admission-card:hover:not(.sold-out){background:oklch(from var(--internal-card) calc(l - 0.02) c h)}.admission-card.sold-out{opacity:1;background:var(--card);position:relative}.admission-card.sold-out .admission-price,.admission-card.sold-out .admission-fee{opacity:0.5}.admission-card:last-child{border-bottom:none}.admission-content{display:flex;justify-content:space-between;align-items:center}.admission-details{flex:1}.admission-title{color:var(--internal-foreground);font-size:var(--internal-font-size-lg);font-weight:var(--internal-font-weight-semibold);margin-bottom:var(--internal-spacing-sm);display:flex;align-items:center;gap:var(--internal-spacing-sm)}.admission-time{color:var(--muted-foreground);font-size:var(--font-size-sm);margin-bottom:var(--spacing-xs);display:flex;align-items:center;gap:var(--spacing-xs)}.admission-time svg{width:calc(var(--spacing-sm) + var(--spacing-xs));height:calc(var(--spacing-sm) + var(--spacing-xs));flex-shrink:0;opacity:0.8}.admission-venue{color:var(--muted-foreground);font-size:var(--font-size-sm);margin-bottom:var(--spacing-sm);display:flex;align-items:center;gap:var(--spacing-xs)}.admission-venue svg{width:calc(var(--spacing-sm) + var(--spacing-xs));height:calc(var(--spacing-sm) + var(--spacing-xs));flex-shrink:0;opacity:0.8}.solo-admission .admission-content{flex-direction:column;align-items:stretch}.solo-admission .admission-details{width:100%}.solo-admission .admission-price-info{margin-top:var(--spacing-md);display:flex;justify-content:space-between;align-items:flex-start;width:100%}.solo-admission .quantity-controls{margin-left:auto;flex-shrink:0}.sold-out-badge{display:inline-flex;align-items:center;justify-content:center;padding:0;background:transparent;color:var(--muted-foreground);border:none;font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);text-transform:uppercase;letter-spacing:0.05em;margin-left:auto;opacity:0.7}.admission-price-info{display:flex;align-items:center;justify-content:space-between;gap:var(--spacing-sm);margin-bottom:var(--spacing-sm);width:100%}.admission-price-wrapper{display:flex;flex-direction:column}.admission-price{color:var(--internal-primary);font-size:var(--internal-font-size-xl);font-weight:var(--internal-font-weight-bold);letter-spacing:-0.025em;line-height:1.1}.admission-fee{color:var(--muted-foreground);font-size:var(--font-size-xs);background:transparent;padding:0;border-radius:0;font-weight:var(--font-weight-normal);display:block;margin-top:0.125rem;line-height:1.12;}.admission-savings{color:var(--success);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium)}.admission-availability{color:var(--warning);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);background:oklch(from var(--warning) l c h / 0.1);padding:calc(var(--spacing-xs) / 2) calc(var(--spacing-xs) * 2);border-radius:calc(var(--radius) - 4px);display:inline-block;margin-top:var(--spacing-xs)}.quantity-controls{display:inline-flex;align-items:center;gap:0;background:var(--internal-secondary);border:1px solid var(--internal-border);border-radius:calc(var(--internal-radius) - 2px);overflow:hidden;box-shadow:none;transition:all var(--internal-transition-fast)}.quantity-btn{width:calc(var(--internal-spacing-lg) * 1.5);height:calc(var(--internal-spacing-lg) * 1.5);border:none;background:transparent;color:var(--internal-muted-foreground);font-size:var(--internal-font-size-base);font-weight:var(--internal-font-weight-medium);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all var(--internal-transition-fast);position:relative}.quantity-btn:focus-visible{outline:2px solid var(--internal-ring);outline-offset:-2px;z-index:1}.quantity-btn:hover:not(:disabled){background:var(--internal-accent);color:var(--internal-accent-foreground)}.quantity-btn:active:not(:disabled){transform:scale(0.95)}.quantity-btn:disabled{opacity:0.6;cursor:not-allowed;background:var(--internal-secondary);color:var(--internal-muted-foreground);border-color:var(--internal-border);box-shadow:none}.quantity-btn.decrease{border-right:1px solid var(--internal-border)}.quantity-btn.increase{border-left:1px solid var(--internal-border)}.quantity-value{min-width:2.5rem;text-align:center;font-size:var(--internal-font-size-sm);font-weight:var(--internal-font-weight-semibold);color:var(--internal-foreground);padding:0 var(--internal-spacing-xs)}.sold-out-controls{display:inline-flex;align-items:center;justify-content:center;min-width:calc(var(--spacing-lg) * 1.5 * 2 + 2.5rem);height:calc(var(--spacing-lg) * 1.5);padding:0 var(--spacing-md);background:var(--muted);color:var(--muted-foreground);border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);letter-spacing:0.025em;text-transform:uppercase}.sold-out-text{color:var(--muted-foreground);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);letter-spacing:0.025em;text-transform:uppercase}.order-summary{background:var(--internal-card);border:1px solid var(--internal-border);border-radius:var(--internal-radius);padding:var(--internal-spacing-lg);margin:var(--internal-spacing-lg) 0 0 0;box-shadow:var(--internal-shadow-lg);width:100%}.summary-title{font-size:var(--internal-font-size-lg);font-weight:var(--internal-font-weight-semibold);margin-bottom:var(--internal-spacing-md);color:var(--internal-foreground);letter-spacing:-0.025em}.order-item{display:flex;justify-content:space-between;margin-bottom:var(--internal-spacing-sm);font-size:var(--internal-font-size-base);color:var(--internal-foreground)}.order-item-with-section{margin-bottom:var(--internal-spacing-sm)}.item-section-line{display:flex;justify-content:space-between;align-items:baseline;font-size:var(--internal-font-size-base);color:var(--internal-foreground)}.item-section-name{flex:1;font-weight:var(--font-weight-medium)}.item-admission-name{font-size:var(--internal-font-size-sm);color:var(--internal-muted-foreground);margin-top:var(--internal-spacing-xs);padding-left:var(--internal-spacing-md);font-weight:var(--internal-font-weight-normal)}.item-description{flex:1;font-weight:var(--internal-font-weight-medium)}.item-price{font-weight:var(--internal-font-weight-bold);white-space:nowrap}.empty-cart-message{display:flex;justify-content:space-between;align-items:center;padding-bottom:var(--internal-spacing-sm);color:var(--internal-muted-foreground);font-size:var(--internal-font-size-base);font-style:normal}.empty-cart-text{flex:1}.empty-cart-price{font-weight:var(--font-weight-medium)}.order-fees{padding:var(--internal-spacing-sm) 0;border-top:1px solid var(--internal-border);border-bottom:1px solid var(--internal-border);margin-bottom:var(--internal-spacing-sm)}.fee-row{display:flex;justify-content:space-between;font-size:var(--internal-font-size-base);color:var(--internal-foreground);font-weight:var(--internal-font-weight-medium)}.order-total{display:flex;justify-content:space-between;font-size:var(--internal-font-size-base);font-weight:var(--internal-font-weight-bold);color:var(--internal-foreground);margin-bottom:var(--internal-spacing-md)}.checkout-btn{width:100%;padding:calc(var(--spacing-sm) + var(--spacing-xs)) var(--spacing-lg);background:var(--primary);color:var(--primary-foreground);border:none;border-radius:calc(var(--radius) - 2px);font-size:var(--internal-font-size-base);font-weight:var(--internal-font-weight-bold);cursor:pointer;transition:all var(--internal-transition-fast);box-shadow:var(--internal-shadow-sm);position:relative;overflow:hidden}.checkout-btn:focus-visible{outline:2px solid var(--internal-ring);outline-offset:2px}.checkout-btn:hover:not(:disabled){background:oklch(from var(--primary) calc(l - 0.08) c h);box-shadow:var(--shadow-md);transform:translateY(-1px)}.checkout-btn:active:not(:disabled){transform:translateY(0);box-shadow:var(--shadow-sm)}.checkout-btn:disabled{opacity:0.6;cursor:not-allowed;background:var(--internal-secondary);color:var(--internal-muted-foreground);box-shadow:none;border:1px solid var(--internal-border)}.loading-state,.error-state{display:flex;justify-content:center;align-items:center;padding:var(--spacing-xl);text-align:center;min-height:200px}.error-state{color:var(--primary)}.error-banner{background:oklch(
|
|
19269
|
+
const sessionServicesTicketingCss = () => `:host{--background:transparent;--foreground:oklch(0.145 0 0);--card:oklch(1 0 0);--card-foreground:oklch(0.145 0 0);--popover:oklch(1 0 0);--popover-foreground:oklch(0.145 0 0);--primary:oklch(0.205 0 0);--primary-foreground:oklch(0.985 0 0);--secondary:oklch(0.97 0 0);--secondary-foreground:oklch(0.205 0 0);--muted:oklch(0.97 0 0);--muted-foreground:oklch(0.556 0 0);--accent:oklch(0.97 0 0);--accent-foreground:oklch(0.205 0 0);--destructive:oklch(0.577 0.245 27.325);--destructive-foreground:oklch(1 0 0);--border:oklch(0.922 0 0);--input:oklch(0.922 0 0);--ring:oklch(0.708 0 0);--success:oklch(0.66 0.154 149.48);--warning:oklch(0.72 0.153 66.34);--info:oklch(0.623 0.214 259.815);--info-foreground:oklch(0.488 0.243 264.376);--backdrop:oklch(0 0 0 / 0.32);--radius:0.625rem;--spacing-xs:0.25rem;--spacing-sm:0.5rem;--spacing-md:1rem;--spacing-lg:1.5rem;--spacing-xl:2rem;--font-family:ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
|
|
19270
|
+
Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;--font-size-xs:0.75rem;--font-size-sm:0.875rem;--font-size-base:1rem;--font-size-lg:1.125rem;--font-size-xl:1.25rem;--font-size-2xl:1.5rem;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--shadow-sm:0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);--shadow-base:0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);--shadow-md:0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1);--shadow-lg:0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1);--shadow-xl:0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1);--transition-fast:150ms cubic-bezier(0.4, 0, 0.2, 1);--transition-base:200ms cubic-bezier(0.4, 0, 0.2, 1);--transition-slow:300ms cubic-bezier(0.4, 0, 0.2, 1);--internal-background:var(--background, transparent);--internal-foreground:var(--foreground, oklch(0.145 0 0));--internal-card:var(--card, oklch(1 0 0));--internal-card-foreground:var(--card-foreground, oklch(0.145 0 0));--internal-popover:var(--popover, oklch(1 0 0));--internal-popover-foreground:var(--popover-foreground, oklch(0.145 0 0));--internal-primary:var(--primary, oklch(0.205 0 0));--internal-primary-foreground:var(--primary-foreground, oklch(0.985 0 0));--internal-secondary:var(--secondary, oklch(0.97 0 0));--internal-secondary-foreground:var(--secondary-foreground, oklch(0.205 0 0));--internal-muted:var(--muted, oklch(0.97 0 0));--internal-muted-foreground:var(--muted-foreground, oklch(0.556 0 0));--internal-accent:var(--accent, oklch(0.97 0 0));--internal-accent-foreground:var(--accent-foreground, oklch(0.205 0 0));--internal-destructive:var(--destructive, oklch(0.577 0.245 27.325));--internal-destructive-foreground:var(--destructive-foreground, oklch(1 0 0));--internal-border:var(--border, oklch(0.922 0 0));--internal-input:var(--input, oklch(0.922 0 0));--internal-ring:var(--ring, oklch(0.708 0 0));--internal-success:var(--success, oklch(0.66 0.154 149.48));--internal-warning:var(--warning, oklch(0.72 0.153 66.34));--internal-info:var(--info, oklch(0.623 0.214 259.815));--internal-info-foreground:var(--info-foreground, oklch(0.488 0.243 264.376));--internal-backdrop:var(--backdrop, oklch(0 0 0 / 0.32));--internal-radius:var(--radius, 0.625rem);--internal-spacing-xs:var(--spacing-xs, 0.25rem);--internal-spacing-sm:var(--spacing-sm, 0.5rem);--internal-spacing-md:var(--spacing-md, 1rem);--internal-spacing-lg:var(--spacing-lg, 1.5rem);--internal-spacing-xl:var(--spacing-xl, 2rem);--internal-font-family:var(--font-family, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif);--internal-font-size-xs:var(--font-size-xs, 0.75rem);--internal-font-size-sm:var(--font-size-sm, 0.875rem);--internal-font-size-base:var(--font-size-base, 1rem);--internal-font-size-lg:var(--font-size-lg, 1.125rem);--internal-font-size-xl:var(--font-size-xl, 1.25rem);--internal-font-size-2xl:var(--font-size-2xl, 1.5rem);--internal-font-weight-normal:var(--font-weight-normal, 400);--internal-font-weight-medium:var(--font-weight-medium, 500);--internal-font-weight-semibold:var(--font-weight-semibold, 600);--internal-font-weight-bold:var(--font-weight-bold, 700);--internal-shadow-sm:var(--shadow-sm, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1));--internal-shadow-base:var(--shadow-base, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1));--internal-shadow-md:var(--shadow-md, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1));--internal-shadow-lg:var(--shadow-lg, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1));--internal-shadow-xl:var(--shadow-xl, 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1));--internal-transition-fast:var(--transition-fast, 150ms cubic-bezier(0.4, 0, 0.2, 1));--internal-transition-base:var(--transition-base, 200ms cubic-bezier(0.4, 0, 0.2, 1));--internal-transition-slow:var(--transition-slow, 300ms cubic-bezier(0.4, 0, 0.2, 1));display:block;font-family:var(--internal-font-family);color:var(--internal-foreground);background:var(--internal-background)}*{box-sizing:border-box;margin:0;padding:0}*:focus{outline:none}*:focus-visible{outline:2px solid var(--internal-ring);outline-offset:2px;border-radius:calc(var(--internal-radius) - 4px)}.session-services-ticketing-container{width:100%;max-width:100%;margin:0}:host([data-theme="dark"]){--background:transparent;--foreground:oklch(0.96 0 0);--card:oklch(0.17 0 0);--card-foreground:oklch(0.96 0 0);--popover:oklch(0.17 0 0);--popover-foreground:oklch(0.96 0 0);--primary:oklch(0.78 0 0);--primary-foreground:oklch(0.14 0 0);--secondary:oklch(0.22 0 0);--secondary-foreground:oklch(0.96 0 0);--muted:oklch(0.22 0 0);--muted-foreground:oklch(0.78 0 0);--accent:oklch(0.22 0 0);--accent-foreground:oklch(0.96 0 0);--destructive:oklch(0.577 0.245 27.325);--destructive-foreground:oklch(1 0 0);--border:oklch(0.29 0 0);--input:oklch(0.29 0 0);--ring:oklch(0.60 0 0);--info:oklch(0.623 0.214 259.815);--info-foreground:oklch(0.707 0.165 254.624)}.tickets-wrapper{padding:0;width:100%}.unsectioned-admissions{width:100%}.unsectioned-admissions .ticket-section{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);margin:0 0 var(--spacing-md) 0;overflow:hidden;width:100%;box-shadow:var(--shadow-sm);transition:box-shadow var(--transition-base)}.unsectioned-admissions .ticket-section:hover{box-shadow:var(--shadow-sm)}.unsectioned-admissions .admission-card{border-radius:var(--radius);border:none}.unsectioned-admissions .admission-card:first-child{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}.unsectioned-admissions .admission-card:last-child{border-bottom-left-radius:var(--radius);border-bottom-right-radius:var(--radius)}.ticket-section{background:var(--internal-card);border:1px solid var(--internal-border);border-radius:var(--internal-radius);margin:0 0 var(--internal-spacing-lg) 0;overflow:hidden;width:100%;box-shadow:var(--internal-shadow-sm);transition:all var(--internal-transition-base)}.tickets-wrapper>.ticket-section:last-child,.tickets-wrapper>.unsectioned-admissions:last-child .ticket-section:last-child{margin-bottom:0}.ticket-section:focus-within{box-shadow:var(--internal-shadow-md)}.ticket-section:hover:not(.section-sold-out){box-shadow:var(--internal-shadow-md)}.ticket-section.section-sold-out{opacity:1;background:var(--card);box-shadow:none;position:relative;border-color:var(--border);overflow:hidden}.ticket-section.section-sold-out .section-header{background:transparent;padding-bottom:var(--spacing-md)}.ticket-section.section-sold-out .section-name,.ticket-section.section-sold-out .section-time,.ticket-section.section-sold-out .section-venue{opacity:0.8}.ticket-section.section-sold-out .admissions-list{opacity:0.6;pointer-events:none;filter:grayscale(0.3)}.ticket-section.section-sold-out .admission-card{background:var(--card)}.ticket-section.section-sold-out .quantity-controls,.ticket-section.section-sold-out .sold-out-controls{opacity:0.7}.section-header{padding:var(--internal-spacing-md) var(--internal-spacing-lg);border-bottom:1px solid var(--internal-border);background:var(--internal-card)}.section-name{color:var(--internal-foreground);font-size:var(--internal-font-size-lg);font-weight:var(--internal-font-weight-semibold);letter-spacing:-0.025em;margin:0 0 var(--internal-spacing-xs) 0;display:flex;align-items:center;gap:var(--internal-spacing-sm)}.section-time{color:var(--internal-muted-foreground);font-size:var(--internal-font-size-sm);margin-bottom:var(--internal-spacing-xs);display:flex;align-items:center;gap:var(--internal-spacing-xs)}.section-time svg{width:calc(var(--spacing-sm) + var(--spacing-xs));height:calc(var(--spacing-sm) + var(--spacing-xs));flex-shrink:0;opacity:0.8}.section-venue{color:var(--muted-foreground);font-size:var(--font-size-sm);display:flex;align-items:center;gap:var(--spacing-xs)}.section-venue svg{width:calc(var(--spacing-sm) + var(--spacing-xs));height:calc(var(--spacing-sm) + var(--spacing-xs));flex-shrink:0;opacity:0.8}.admissions-list{padding:0}.admission-card{border-bottom:1px solid var(--internal-border);padding:var(--internal-spacing-md) var(--internal-spacing-lg);position:relative;transition:background-color var(--internal-transition-base);cursor:default}.admission-card:focus-visible{outline:2px solid var(--internal-ring);outline-offset:-2px;z-index:1}.admission-card:hover:not(.sold-out){background:oklch(from var(--internal-card) calc(l - 0.02) c h)}.admission-card.sold-out{opacity:1;background:var(--card);position:relative}.admission-card.sold-out .admission-price,.admission-card.sold-out .admission-fee{opacity:0.5}.admission-card:last-child{border-bottom:none}.admission-content{display:flex;justify-content:space-between;align-items:center}.admission-details{flex:1}.admission-header{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--internal-spacing-md);margin-bottom:var(--internal-spacing-sm)}.admission-header-text{flex:1;min-width:0}.admission-title{color:var(--internal-foreground);font-size:var(--internal-font-size-lg);font-weight:var(--internal-font-weight-semibold);margin-bottom:0;display:flex;align-items:center;gap:var(--internal-spacing-sm)}.admission-subtitle{color:var(--internal-muted-foreground);font-size:var(--internal-font-size-sm);margin-top:var(--internal-spacing-xs);line-height:1.4}.more-info-badge{display:inline-flex;align-items:center;gap:calc(var(--internal-spacing-xs) * 1.5);padding:calc(var(--internal-spacing-xs) * 1.5) var(--internal-spacing-sm);background:oklch(from var(--internal-info) l c h / 0.08);color:var(--internal-info-foreground);border:none;border-radius:calc(var(--internal-radius) - 2px);font-size:var(--internal-font-size-xs);font-weight:var(--internal-font-weight-medium);cursor:pointer;transition:all var(--internal-transition-fast);white-space:nowrap;flex-shrink:0}.more-info-badge:hover{background:oklch(from var(--internal-info) l c h / 0.16)}.more-info-badge:focus-visible{outline:2px solid var(--internal-ring);outline-offset:2px}.more-info-badge svg{flex-shrink:0}.admission-time{color:var(--muted-foreground);font-size:var(--font-size-sm);margin-bottom:var(--spacing-xs);display:flex;align-items:center;gap:var(--spacing-xs)}.admission-time svg{width:calc(var(--spacing-sm) + var(--spacing-xs));height:calc(var(--spacing-sm) + var(--spacing-xs));flex-shrink:0;opacity:0.8}.admission-venue{color:var(--muted-foreground);font-size:var(--font-size-sm);margin-bottom:var(--spacing-sm);display:flex;align-items:center;gap:var(--spacing-xs)}.admission-venue svg{width:calc(var(--spacing-sm) + var(--spacing-xs));height:calc(var(--spacing-sm) + var(--spacing-xs));flex-shrink:0;opacity:0.8}.solo-admission .admission-content{flex-direction:column;align-items:stretch}.solo-admission .admission-details{width:100%}.solo-admission .admission-price-info{margin-top:var(--spacing-md);display:flex;justify-content:space-between;align-items:flex-start;width:100%}.solo-admission .quantity-controls{margin-left:auto;flex-shrink:0}.sold-out-badge{display:inline-flex;align-items:center;justify-content:center;padding:0;background:transparent;color:var(--muted-foreground);border:none;font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);text-transform:uppercase;letter-spacing:0.05em;margin-left:auto;opacity:0.7}.admission-price-info{display:flex;align-items:center;justify-content:space-between;gap:var(--spacing-sm);margin-bottom:var(--spacing-sm);width:100%}.admission-price-wrapper{display:flex;flex-direction:column}.admission-price{color:var(--internal-primary);font-size:var(--internal-font-size-xl);font-weight:var(--internal-font-weight-bold);letter-spacing:-0.025em;line-height:1.1}.admission-fee{color:var(--muted-foreground);font-size:var(--font-size-xs);background:transparent;padding:0;border-radius:0;font-weight:var(--font-weight-normal);display:block;margin-top:0.125rem;line-height:1.12;}.admission-savings{color:var(--success);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium)}.admission-availability{color:var(--warning);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);background:oklch(from var(--warning) l c h / 0.1);padding:calc(var(--spacing-xs) / 2) calc(var(--spacing-xs) * 2);border-radius:calc(var(--radius) - 4px);display:inline-block;margin-top:var(--spacing-xs)}.quantity-controls{display:inline-flex;align-items:center;gap:0;background:var(--internal-secondary);border:1px solid var(--internal-border);border-radius:calc(var(--internal-radius) - 2px);overflow:hidden;box-shadow:none;transition:all var(--internal-transition-fast)}.quantity-btn{width:calc(var(--internal-spacing-lg) * 1.5);height:calc(var(--internal-spacing-lg) * 1.5);border:none;background:transparent;color:var(--internal-muted-foreground);font-size:var(--internal-font-size-base);font-weight:var(--internal-font-weight-medium);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all var(--internal-transition-fast);position:relative}.quantity-btn:focus-visible{outline:2px solid var(--internal-ring);outline-offset:-2px;z-index:1}.quantity-btn:hover:not(:disabled){background:var(--internal-accent);color:var(--internal-accent-foreground)}.quantity-btn:active:not(:disabled){transform:scale(0.95)}.quantity-btn:disabled{opacity:0.6;cursor:not-allowed;background:var(--internal-secondary);color:var(--internal-muted-foreground);border-color:var(--internal-border);box-shadow:none}.quantity-btn.decrease{border-right:1px solid var(--internal-border)}.quantity-btn.increase{border-left:1px solid var(--internal-border)}.quantity-value{min-width:2.5rem;text-align:center;font-size:var(--internal-font-size-sm);font-weight:var(--internal-font-weight-semibold);color:var(--internal-foreground);padding:0 var(--internal-spacing-xs)}.sold-out-controls{display:inline-flex;align-items:center;justify-content:center;min-width:calc(var(--spacing-lg) * 1.5 * 2 + 2.5rem);height:calc(var(--spacing-lg) * 1.5);padding:0 var(--spacing-md);background:var(--muted);color:var(--muted-foreground);border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);letter-spacing:0.025em;text-transform:uppercase}.sold-out-text{color:var(--muted-foreground);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);letter-spacing:0.025em;text-transform:uppercase}.order-summary{background:var(--internal-card);border:1px solid var(--internal-border);border-radius:var(--internal-radius);padding:var(--internal-spacing-lg);margin:var(--internal-spacing-lg) 0 0 0;box-shadow:var(--internal-shadow-lg);width:100%}.summary-title{font-size:var(--internal-font-size-lg);font-weight:var(--internal-font-weight-semibold);margin-bottom:var(--internal-spacing-md);color:var(--internal-foreground);letter-spacing:-0.025em}.order-item{display:flex;justify-content:space-between;margin-bottom:var(--internal-spacing-sm);font-size:var(--internal-font-size-base);color:var(--internal-foreground)}.order-item-with-section{margin-bottom:var(--internal-spacing-sm)}.item-section-line{display:flex;justify-content:space-between;align-items:baseline;font-size:var(--internal-font-size-base);color:var(--internal-foreground)}.item-section-name{flex:1;font-weight:var(--font-weight-medium)}.item-admission-name{font-size:var(--internal-font-size-sm);color:var(--internal-muted-foreground);margin-top:var(--internal-spacing-xs);padding-left:var(--internal-spacing-md);font-weight:var(--internal-font-weight-normal)}.item-description{flex:1;font-weight:var(--internal-font-weight-medium)}.item-price{font-weight:var(--internal-font-weight-bold);white-space:nowrap}.empty-cart-message{display:flex;justify-content:space-between;align-items:center;padding-bottom:var(--internal-spacing-sm);color:var(--internal-muted-foreground);font-size:var(--internal-font-size-base);font-style:normal}.empty-cart-text{flex:1}.empty-cart-price{font-weight:var(--font-weight-medium)}.order-fees{padding:var(--internal-spacing-sm) 0;border-top:1px solid var(--internal-border);border-bottom:1px solid var(--internal-border);margin-bottom:var(--internal-spacing-sm)}.fee-row{display:flex;justify-content:space-between;font-size:var(--internal-font-size-base);color:var(--internal-foreground);font-weight:var(--internal-font-weight-medium)}.order-total{display:flex;justify-content:space-between;font-size:var(--internal-font-size-base);font-weight:var(--internal-font-weight-bold);color:var(--internal-foreground);margin-bottom:var(--internal-spacing-md)}.checkout-btn{width:100%;padding:calc(var(--spacing-sm) + var(--spacing-xs)) var(--spacing-lg);background:var(--primary);color:var(--primary-foreground);border:none;border-radius:calc(var(--radius) - 2px);font-size:var(--internal-font-size-base);font-weight:var(--internal-font-weight-bold);cursor:pointer;transition:all var(--internal-transition-fast);box-shadow:var(--internal-shadow-sm);position:relative;overflow:hidden}.checkout-btn:focus-visible{outline:2px solid var(--internal-ring);outline-offset:2px}.checkout-btn:hover:not(:disabled){background:oklch(from var(--primary) calc(l - 0.08) c h);box-shadow:var(--shadow-md);transform:translateY(-1px)}.checkout-btn:active:not(:disabled){transform:translateY(0);box-shadow:var(--shadow-sm)}.checkout-btn:disabled{opacity:0.6;cursor:not-allowed;background:var(--internal-secondary);color:var(--internal-muted-foreground);box-shadow:none;border:1px solid var(--internal-border)}.loading-state,.error-state{display:flex;justify-content:center;align-items:center;padding:var(--spacing-xl);text-align:center;min-height:200px}.error-state{color:var(--primary)}.error-banner{background:oklch(
|
|
18074
19271
|
from var(--destructive) calc(l + 0.4) calc(c * 0.2) h / 0.05
|
|
18075
19272
|
);border:1px solid oklch(from var(--destructive) l c h / 0.2);border-radius:var(--radius);padding:var(--spacing-lg);margin:var(--spacing-lg);text-align:center}.error-banner strong{display:block;color:var(--destructive);font-size:var(--font-size-lg);margin-bottom:var(--spacing-sm)}.error-banner p{color:var(--muted-foreground);margin-bottom:var(--spacing-md)}.retry-button{background:var(--primary);color:var(--primary-foreground);border:none;padding:calc(var(--spacing-sm) + var(--spacing-xs)) var(--spacing-lg);border-radius:calc(var(--radius) - 2px);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);cursor:pointer;transition:all var(--transition-fast);box-shadow:var(--shadow-sm)}.retry-button:focus-visible{outline:2px solid var(--ring);outline-offset:2px}.retry-button:hover{background:oklch(from var(--primary) calc(l - 0.08) c h);box-shadow:var(--shadow-md);transform:translateY(-1px)}.retry-button:active{transform:translateY(0);box-shadow:var(--shadow-sm)}.error-message{background:oklch(
|
|
18076
19273
|
from var(--destructive) calc(l + 0.4) calc(c * 0.2) h / 0.05
|
|
18077
|
-
);border:1px solid oklch(from var(--destructive) l c h / 0.2);color:var(--destructive);padding:var(--spacing-sm) var(--spacing-md);border-radius:var(--radius);margin-bottom:var(--spacing-md);font-size:var(--font-size-sm)}@media (min-width: 768px){.ticket-section{border-radius:var(--radius);margin:0 0 var(--spacing-md) 0}.order-summary{border-radius:var(--radius);margin:var(--spacing-md) 0}}`;
|
|
19274
|
+
);border:1px solid oklch(from var(--destructive) l c h / 0.2);color:var(--destructive);padding:var(--spacing-sm) var(--spacing-md);border-radius:var(--radius);margin-bottom:var(--spacing-md);font-size:var(--font-size-sm)}@media (min-width: 768px){.ticket-section{border-radius:var(--radius);margin:0 0 var(--spacing-md) 0}.order-summary{border-radius:var(--radius);margin:var(--spacing-md) 0}}.modal-backdrop{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;padding:var(--internal-spacing-md);background:var(--internal-backdrop);backdrop-filter:blur(4px);animation:modal-backdrop-fade-in var(--internal-transition-base) ease-out}@keyframes modal-backdrop-fade-in{from{opacity:0}to{opacity:1}}.modal-content{position:relative;width:100%;max-width:32rem;max-height:calc(100vh - var(--internal-spacing-xl) * 2);overflow-y:auto;background:var(--internal-popover);color:var(--internal-popover-foreground);border:1px solid var(--internal-border);border-radius:var(--internal-radius);padding:var(--internal-spacing-lg);box-shadow:var(--internal-shadow-xl);animation:modal-content-scale-in var(--internal-transition-base) ease-out}@keyframes modal-content-scale-in{from{opacity:0;transform:scale(0.98)}to{opacity:1;transform:scale(1)}}.modal-close-btn{position:absolute;top:var(--internal-spacing-sm);right:var(--internal-spacing-sm);display:flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;padding:0;background:transparent;border:1px solid transparent;border-radius:calc(var(--internal-radius) - 4px);color:var(--internal-muted-foreground);cursor:pointer;opacity:0.72;transition:all var(--internal-transition-fast)}.modal-close-btn:hover{opacity:1;background:var(--internal-accent)}.modal-close-btn:focus-visible{outline:2px solid var(--internal-ring);outline-offset:1px;opacity:1}.modal-header{margin-bottom:var(--internal-spacing-md);padding-right:var(--internal-spacing-xl)}.modal-title{font-size:var(--internal-font-size-xl);font-weight:var(--internal-font-weight-semibold);color:var(--internal-foreground);margin:0;line-height:1.2}.modal-subtitle{color:var(--internal-muted-foreground);font-size:var(--internal-font-size-sm);margin-top:var(--internal-spacing-xs);line-height:1.4}.modal-description{color:var(--internal-foreground);font-size:var(--internal-font-size-base);line-height:1.6;white-space:pre-wrap;margin:0}`;
|
|
18078
19275
|
|
|
18079
19276
|
const CalendarIcon = () => (h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", "aria-hidden": "true" }, h("path", { d: "M8 2v4" }), h("path", { d: "M16 2v4" }), h("rect", { width: "18", height: "18", x: "3", y: "4", rx: "2" }), h("path", { d: "M3 10h18" })));
|
|
18080
19277
|
const LocationIcon = () => (h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", "aria-hidden": "true" }, h("path", { d: "M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0" }), h("circle", { cx: "12", cy: "10", r: "3" })));
|
|
19278
|
+
const InfoIcon = () => (h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", "aria-hidden": "true" }, h("circle", { cx: "12", cy: "12", r: "10" }), h("path", { d: "M12 16v-4" }), h("path", { d: "M12 8h.01" })));
|
|
19279
|
+
const CloseIcon = () => (h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", "aria-hidden": "true" }, h("path", { d: "M18 6 6 18" }), h("path", { d: "M6 6l12 12" })));
|
|
18081
19280
|
const SessionsTicketing = class {
|
|
18082
19281
|
constructor(hostRef) {
|
|
18083
19282
|
registerInstance(this, hostRef);
|
|
@@ -18102,6 +19301,7 @@ const SessionsTicketing = class {
|
|
|
18102
19301
|
quoteError = null;
|
|
18103
19302
|
checkoutLoading = false;
|
|
18104
19303
|
currentTheme = "light";
|
|
19304
|
+
openModalAdmissionId = null;
|
|
18105
19305
|
checkoutInit;
|
|
18106
19306
|
cartUpdate;
|
|
18107
19307
|
errorOccurred;
|
|
@@ -18122,6 +19322,10 @@ const SessionsTicketing = class {
|
|
|
18122
19322
|
if (this.mediaQueryList) {
|
|
18123
19323
|
this.mediaQueryList.removeEventListener("change", this.handleSystemThemeChange);
|
|
18124
19324
|
}
|
|
19325
|
+
// Clean up modal listener if component unmounts while modal is open
|
|
19326
|
+
if (this.openModalAdmissionId) {
|
|
19327
|
+
document.removeEventListener("keydown", this.handleModalKeyDown);
|
|
19328
|
+
}
|
|
18125
19329
|
}
|
|
18126
19330
|
async initializeComponent() {
|
|
18127
19331
|
this.error = null;
|
|
@@ -18161,13 +19365,16 @@ const SessionsTicketing = class {
|
|
|
18161
19365
|
trackEvent(eventType, properties = {}) {
|
|
18162
19366
|
if (!this.analytics || !this.enableAnalytics)
|
|
18163
19367
|
return;
|
|
19368
|
+
// Ensure required fields exist before tracking
|
|
19369
|
+
if (!this.event?.teamId || !this.event?.promoterId)
|
|
19370
|
+
return;
|
|
18164
19371
|
this.analytics.track(eventType, {
|
|
18165
19372
|
event_id: this.eventId,
|
|
18166
|
-
team_id: this.event
|
|
18167
|
-
promoter_id: this.event
|
|
18168
|
-
event_name: this.event
|
|
18169
|
-
event_slug: this.event
|
|
18170
|
-
currency: this.event
|
|
19373
|
+
team_id: this.event.teamId,
|
|
19374
|
+
promoter_id: this.event.promoterId,
|
|
19375
|
+
event_name: this.event.name,
|
|
19376
|
+
event_slug: this.event.slug,
|
|
19377
|
+
currency: this.event.currency,
|
|
18171
19378
|
...properties,
|
|
18172
19379
|
});
|
|
18173
19380
|
}
|
|
@@ -18449,6 +19656,26 @@ const SessionsTicketing = class {
|
|
|
18449
19656
|
handleQuantityIncrease = async (admissionId, sectionId) => {
|
|
18450
19657
|
await this.updateQuantity(admissionId, sectionId, 1);
|
|
18451
19658
|
};
|
|
19659
|
+
openModal = (admissionId, e) => {
|
|
19660
|
+
e.stopPropagation();
|
|
19661
|
+
this.openModalAdmissionId = admissionId;
|
|
19662
|
+
document.addEventListener("keydown", this.handleModalKeyDown);
|
|
19663
|
+
};
|
|
19664
|
+
closeModal = () => {
|
|
19665
|
+
this.openModalAdmissionId = null;
|
|
19666
|
+
document.removeEventListener("keydown", this.handleModalKeyDown);
|
|
19667
|
+
};
|
|
19668
|
+
handleModalKeyDown = (e) => {
|
|
19669
|
+
if (e.key === "Escape") {
|
|
19670
|
+
this.closeModal();
|
|
19671
|
+
}
|
|
19672
|
+
};
|
|
19673
|
+
handleBackdropClick = (e) => {
|
|
19674
|
+
if (e.target instanceof HTMLElement &&
|
|
19675
|
+
e.target.classList.contains("modal-backdrop")) {
|
|
19676
|
+
this.closeModal();
|
|
19677
|
+
}
|
|
19678
|
+
};
|
|
18452
19679
|
renderQuantityControls(admission, sectionId) {
|
|
18453
19680
|
const key = `${admission.id}::${sectionId || "none"}`;
|
|
18454
19681
|
const quantity = this.selectedItems.get(key) || 0;
|
|
@@ -18474,7 +19701,7 @@ const SessionsTicketing = class {
|
|
|
18474
19701
|
const ariaLabel = section
|
|
18475
19702
|
? `${admission.name} in ${section.name} - ${isSoldOut ? "Sold Out" : this.formatPriceValue(basePrice)}`
|
|
18476
19703
|
: `${admission.name} - ${isSoldOut ? "Sold Out" : this.formatPriceValue(basePrice)}`;
|
|
18477
|
-
return (h("section", { class: `admission-card ${isSoldOut ? "sold-out" : ""} ${isStandaloneAdmission ? "solo-admission" : ""}`, key: key, tabindex: isSoldOut ? -1 : 0, "aria-label": ariaLabel }, h("div", { class: "admission-content" }, h("div", { class: "admission-details" }, h("h3", { class: "admission-title" }, admission.name), isStandaloneAdmission && (h(h.Fragment, null, this.renderEventTimeAndLocation(), this.renderPriceAndControls(admission, sectionId, isSoldOut))), section &&
|
|
19704
|
+
return (h("section", { class: `admission-card ${isSoldOut ? "sold-out" : ""} ${isStandaloneAdmission ? "solo-admission" : ""}`, key: key, tabindex: isSoldOut ? -1 : 0, "aria-label": ariaLabel }, h("div", { class: "admission-content" }, h("div", { class: "admission-details" }, h("div", { class: "admission-header" }, h("div", { class: "admission-header-text" }, h("h3", { class: "admission-title" }, admission.name), admission.subtitle && (h("p", { class: "admission-subtitle" }, admission.subtitle))), admission.description && (h("button", { type: "button", class: "more-info-badge", onClick: (e) => this.openModal(admission.id, e), "aria-label": `More info about ${admission.name}` }, InfoIcon(), h("span", null, "More info")))), isStandaloneAdmission && (h(h.Fragment, null, this.renderEventTimeAndLocation(), this.renderPriceAndControls(admission, sectionId, isSoldOut))), section &&
|
|
18478
19705
|
this.renderPriceAndControls(admission, sectionId, isSoldOut)))));
|
|
18479
19706
|
}
|
|
18480
19707
|
renderSectionHeader(section, isSectionSoldOut) {
|
|
@@ -18535,6 +19762,16 @@ const SessionsTicketing = class {
|
|
|
18535
19762
|
? "Free"
|
|
18536
19763
|
: this.formatPriceValue(this.quote.price?.total || 0))), h("button", { type: "button", class: "checkout-btn", onClick: () => this.initiateCheckout(), disabled: this.isCheckoutDisabled() }, this.getCheckoutButtonText())));
|
|
18537
19764
|
}
|
|
19765
|
+
renderModal() {
|
|
19766
|
+
if (!this.openModalAdmissionId)
|
|
19767
|
+
return null;
|
|
19768
|
+
const admission = this.event?.admissions.find((a) => a.id === this.openModalAdmissionId);
|
|
19769
|
+
if (!admission)
|
|
19770
|
+
return null;
|
|
19771
|
+
return (
|
|
19772
|
+
// biome-ignore lint/a11y/noStaticElementInteractions lint/a11y/useKeyWithClickEvents: backdrop click-to-close is a common modal pattern, keyboard handled via Escape key
|
|
19773
|
+
h("div", { class: "modal-backdrop", onClick: this.handleBackdropClick }, h("div", { class: "modal-content", role: "dialog", "aria-modal": "true", "aria-labelledby": "modal-title" }, h("button", { type: "button", class: "modal-close-btn", onClick: () => this.closeModal(), "aria-label": "Close" }, CloseIcon()), h("div", { class: "modal-header" }, h("h2", { id: "modal-title", class: "modal-title" }, admission.name), admission.subtitle && (h("p", { class: "modal-subtitle" }, admission.subtitle))), h("p", { class: "modal-description" }, admission.description))));
|
|
19774
|
+
}
|
|
18538
19775
|
renderTicketSections() {
|
|
18539
19776
|
const generalAdmissions = this.event?.admissions.filter((adm) => !adm.sectionId) || [];
|
|
18540
19777
|
return (h("div", { class: "tickets-wrapper" }, generalAdmissions.length > 0 && (h("div", { class: "unsectioned-admissions" }, generalAdmissions
|
|
@@ -18550,7 +19787,7 @@ const SessionsTicketing = class {
|
|
|
18550
19787
|
return this.renderErrorState();
|
|
18551
19788
|
if (!this.event)
|
|
18552
19789
|
return this.renderNotFoundState();
|
|
18553
|
-
return (h(Host, { "data-theme": this.currentTheme }, h("div", { class: "session-services-ticketing-container" }, this.renderTicketSections(), this.renderOrderSummary())));
|
|
19790
|
+
return (h(Host, { "data-theme": this.currentTheme }, h("div", { class: "session-services-ticketing-container" }, this.renderTicketSections(), this.renderOrderSummary()), this.renderModal()));
|
|
18554
19791
|
}
|
|
18555
19792
|
static get watchers() { return {
|
|
18556
19793
|
"tenantId": ["propsChanged"],
|