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