@huly-embed/core 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/messages.d.ts +12 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +64 -0
- package/dist/messages.js.map +1 -0
- package/dist/token.d.ts +4 -0
- package/dist/token.d.ts.map +1 -0
- package/dist/token.js +51 -0
- package/dist/token.js.map +1 -0
- package/dist/types.d.ts +51 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/url.d.ts +14 -0
- package/dist/url.d.ts.map +1 -0
- package/dist/url.js +25 -0
- package/dist/url.js.map +1 -0
- package/package.json +35 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { HulyEmbedConfig, HulyEmbedComponent, EmbedHideableField, EmbedTokenResponse, HulyReadyEvent, HulyIssueCreatedEvent, HulyIssueCancelledEvent, HulyIssueSelectedEvent, HulyIssueClosedEvent, HulyResizeEvent, HulyEmbedError, HulyEmbedMessage, HulyEmbedState, } from './types.js';
|
|
2
|
+
export { EmbedMessageTypes, isHulyMessage, parseHulyMessage } from './messages.js';
|
|
3
|
+
export { fetchEmbedToken, createTokenRefresher } from './token.js';
|
|
4
|
+
export type { BuildEmbedUrlParams } from './url.js';
|
|
5
|
+
export { buildEmbedUrl, getParentOrigin } from './url.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACnE,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { HulyEmbedMessage } from './types.js';
|
|
2
|
+
export declare const EmbedMessageTypes: {
|
|
3
|
+
readonly Ready: "huly-embed-ready";
|
|
4
|
+
readonly IssueCreated: "huly-embed-issue-created";
|
|
5
|
+
readonly IssueSelected: "huly-embed-issue-selected";
|
|
6
|
+
readonly IssueClosed: "huly-embed-issue-closed";
|
|
7
|
+
readonly Resize: "huly-embed-resize";
|
|
8
|
+
readonly Error: "huly-embed-error";
|
|
9
|
+
};
|
|
10
|
+
export declare function isHulyMessage(event: MessageEvent, allowedOrigins: string[]): boolean;
|
|
11
|
+
export declare function parseHulyMessage(event: MessageEvent): HulyEmbedMessage | null;
|
|
12
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,eAAO,MAAM,iBAAiB;;;;;;;CAOpB,CAAC;AAMX,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAepF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,gBAAgB,GAAG,IAAI,CA+C7E"}
|
package/dist/messages.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export const EmbedMessageTypes = {
|
|
2
|
+
Ready: 'huly-embed-ready',
|
|
3
|
+
IssueCreated: 'huly-embed-issue-created',
|
|
4
|
+
IssueSelected: 'huly-embed-issue-selected',
|
|
5
|
+
IssueClosed: 'huly-embed-issue-closed',
|
|
6
|
+
Resize: 'huly-embed-resize',
|
|
7
|
+
Error: 'huly-embed-error',
|
|
8
|
+
};
|
|
9
|
+
const HULY_PREFIX = 'huly-embed-';
|
|
10
|
+
const VALID_TYPES = new Set(Object.values(EmbedMessageTypes));
|
|
11
|
+
export function isHulyMessage(event, allowedOrigins) {
|
|
12
|
+
if (!allowedOrigins.includes(event.origin)) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
const data = event.data;
|
|
16
|
+
if (typeof data !== 'object' || data === null) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
if (typeof data.type !== 'string' || !data.type.startsWith(HULY_PREFIX)) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
return VALID_TYPES.has(data.type);
|
|
23
|
+
}
|
|
24
|
+
export function parseHulyMessage(event) {
|
|
25
|
+
const data = event.data;
|
|
26
|
+
if (typeof data !== 'object' || data === null || typeof data.type !== 'string') {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
switch (data.type) {
|
|
30
|
+
case EmbedMessageTypes.Ready:
|
|
31
|
+
return { type: data.type };
|
|
32
|
+
case EmbedMessageTypes.IssueCreated:
|
|
33
|
+
if (data.cancelled === true) {
|
|
34
|
+
return { type: data.type, cancelled: true };
|
|
35
|
+
}
|
|
36
|
+
if (typeof data.issueId === 'string' && typeof data.identifier === 'string') {
|
|
37
|
+
return { type: data.type, issueId: data.issueId, identifier: data.identifier };
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
case EmbedMessageTypes.IssueSelected:
|
|
41
|
+
if (typeof data.identifier === 'string') {
|
|
42
|
+
return { type: data.type, identifier: data.identifier };
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
case EmbedMessageTypes.IssueClosed:
|
|
46
|
+
return {
|
|
47
|
+
type: data.type,
|
|
48
|
+
...(typeof data.identifier === 'string' ? { identifier: data.identifier } : {}),
|
|
49
|
+
};
|
|
50
|
+
case EmbedMessageTypes.Resize:
|
|
51
|
+
if (typeof data.height === 'number') {
|
|
52
|
+
return { type: data.type, height: data.height };
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
case EmbedMessageTypes.Error:
|
|
56
|
+
if (typeof data.reason === 'string') {
|
|
57
|
+
return { type: data.type, reason: data.reason };
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
default:
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
|
package/dist/token.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { EmbedTokenResponse, HulyEmbedComponent } from './types.js';
|
|
2
|
+
export declare function fetchEmbedToken(tokenEndpoint: string, component: HulyEmbedComponent): Promise<EmbedTokenResponse>;
|
|
3
|
+
export declare function createTokenRefresher(tokenEndpoint: string, component: HulyEmbedComponent, bufferSeconds: number, initialExpiresIn: number, onToken: (response: EmbedTokenResponse) => void, onError: (error: Error) => void): () => void;
|
|
4
|
+
//# sourceMappingURL=token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../src/token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEzE,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,kBAAkB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAoB7B;AAID,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,kBAAkB,EAC7B,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,EACxB,OAAO,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,EAC/C,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAC9B,MAAM,IAAI,CAoCZ"}
|
package/dist/token.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export async function fetchEmbedToken(tokenEndpoint, component) {
|
|
2
|
+
const url = new URL(tokenEndpoint);
|
|
3
|
+
url.searchParams.set('component', component);
|
|
4
|
+
const response = await fetch(url.toString(), {
|
|
5
|
+
method: 'GET',
|
|
6
|
+
credentials: 'include',
|
|
7
|
+
});
|
|
8
|
+
if (!response.ok) {
|
|
9
|
+
throw new Error(`Token fetch failed: ${response.status} ${response.statusText}`);
|
|
10
|
+
}
|
|
11
|
+
const data = await response.json();
|
|
12
|
+
if (typeof data.token !== 'string' || typeof data.expiresIn !== 'number') {
|
|
13
|
+
throw new Error('Invalid token response: missing token or expiresIn');
|
|
14
|
+
}
|
|
15
|
+
return { token: data.token, expiresIn: data.expiresIn };
|
|
16
|
+
}
|
|
17
|
+
const MIN_REFRESH_INTERVAL_MS = 10_000;
|
|
18
|
+
export function createTokenRefresher(tokenEndpoint, component, bufferSeconds, initialExpiresIn, onToken, onError) {
|
|
19
|
+
let timerId = null;
|
|
20
|
+
let destroyed = false;
|
|
21
|
+
function scheduleRefresh(expiresIn) {
|
|
22
|
+
if (destroyed)
|
|
23
|
+
return;
|
|
24
|
+
const refreshMs = Math.max((expiresIn - bufferSeconds) * 1000, MIN_REFRESH_INTERVAL_MS);
|
|
25
|
+
timerId = setTimeout(async () => {
|
|
26
|
+
if (destroyed)
|
|
27
|
+
return;
|
|
28
|
+
try {
|
|
29
|
+
const response = await fetchEmbedToken(tokenEndpoint, component);
|
|
30
|
+
if (destroyed)
|
|
31
|
+
return;
|
|
32
|
+
onToken(response);
|
|
33
|
+
scheduleRefresh(response.expiresIn);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
if (destroyed)
|
|
37
|
+
return;
|
|
38
|
+
onError(err instanceof Error ? err : new Error(String(err)));
|
|
39
|
+
}
|
|
40
|
+
}, refreshMs);
|
|
41
|
+
}
|
|
42
|
+
scheduleRefresh(initialExpiresIn);
|
|
43
|
+
return () => {
|
|
44
|
+
destroyed = true;
|
|
45
|
+
if (timerId !== null) {
|
|
46
|
+
clearTimeout(timerId);
|
|
47
|
+
timerId = null;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../src/token.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,aAAqB,EACrB,SAA6B;IAE7B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IACnC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAE7C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;QAC3C,MAAM,EAAE,KAAK;QACb,WAAW,EAAE,SAAS;KACvB,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEnC,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAEvC,MAAM,UAAU,oBAAoB,CAClC,aAAqB,EACrB,SAA6B,EAC7B,aAAqB,EACrB,gBAAwB,EACxB,OAA+C,EAC/C,OAA+B;IAE/B,IAAI,OAAO,GAAyC,IAAI,CAAC;IACzD,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,SAAS,eAAe,CAAC,SAAiB;QACxC,IAAI,SAAS;YAAE,OAAO;QAEtB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,CAAC,SAAS,GAAG,aAAa,CAAC,GAAG,IAAI,EAClC,uBAAuB,CACxB,CAAC;QAEF,OAAO,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YAC9B,IAAI,SAAS;gBAAE,OAAO;YAEtB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;gBACjE,IAAI,SAAS;oBAAE,OAAO;gBACtB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAClB,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,SAAS;oBAAE,OAAO;gBACtB,OAAO,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC,EAAE,SAAS,CAAC,CAAC;IAChB,CAAC;IAED,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAElC,OAAO,GAAG,EAAE;QACV,SAAS,GAAG,IAAI,CAAC;QACjB,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export interface HulyEmbedConfig {
|
|
2
|
+
hulyUrl: string;
|
|
3
|
+
defaultProject: string;
|
|
4
|
+
tokenEndpoint: string;
|
|
5
|
+
allowedOrigins?: string[];
|
|
6
|
+
tokenRefreshBuffer?: number;
|
|
7
|
+
}
|
|
8
|
+
export type HulyEmbedComponent = 'create-issue' | 'issue-list' | 'issue-detail' | 'kanban' | 'comments';
|
|
9
|
+
export type EmbedHideableField = 'status' | 'priority' | 'assignee' | 'estimation' | 'milestone' | 'duedate' | 'parent';
|
|
10
|
+
export interface EmbedTokenResponse {
|
|
11
|
+
token: string;
|
|
12
|
+
expiresIn: number;
|
|
13
|
+
}
|
|
14
|
+
export interface HulyReadyEvent {
|
|
15
|
+
type: 'huly-embed-ready';
|
|
16
|
+
}
|
|
17
|
+
export interface HulyIssueCreatedEvent {
|
|
18
|
+
type: 'huly-embed-issue-created';
|
|
19
|
+
issueId: string;
|
|
20
|
+
identifier: string;
|
|
21
|
+
cancelled?: never;
|
|
22
|
+
}
|
|
23
|
+
export interface HulyIssueCancelledEvent {
|
|
24
|
+
type: 'huly-embed-issue-created';
|
|
25
|
+
cancelled: true;
|
|
26
|
+
issueId?: never;
|
|
27
|
+
identifier?: never;
|
|
28
|
+
}
|
|
29
|
+
export interface HulyIssueSelectedEvent {
|
|
30
|
+
type: 'huly-embed-issue-selected';
|
|
31
|
+
identifier: string;
|
|
32
|
+
}
|
|
33
|
+
export interface HulyIssueClosedEvent {
|
|
34
|
+
type: 'huly-embed-issue-closed';
|
|
35
|
+
identifier?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface HulyResizeEvent {
|
|
38
|
+
type: 'huly-embed-resize';
|
|
39
|
+
height: number;
|
|
40
|
+
}
|
|
41
|
+
export interface HulyEmbedError {
|
|
42
|
+
type: 'huly-embed-error';
|
|
43
|
+
reason: string;
|
|
44
|
+
}
|
|
45
|
+
export type HulyEmbedMessage = HulyReadyEvent | HulyIssueCreatedEvent | HulyIssueCancelledEvent | HulyIssueSelectedEvent | HulyIssueClosedEvent | HulyResizeEvent | HulyEmbedError;
|
|
46
|
+
export interface HulyEmbedState {
|
|
47
|
+
embedUrl: string | null;
|
|
48
|
+
loading: boolean;
|
|
49
|
+
error: string | null;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,kBAAkB,GAAG,cAAc,GAAG,YAAY,GAAG,cAAc,GAAG,QAAQ,GAAG,UAAU,CAAC;AAExG,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;AAExH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,0BAA0B,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,KAAK,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,0BAA0B,CAAC;IACjC,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,KAAK,CAAC;IAChB,UAAU,CAAC,EAAE,KAAK,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,2BAA2B,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,yBAAyB,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,gBAAgB,GACxB,cAAc,GACd,qBAAqB,GACrB,uBAAuB,GACvB,sBAAsB,GACtB,oBAAoB,GACpB,eAAe,GACf,cAAc,CAAC;AAEnB,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/url.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { HulyEmbedComponent, EmbedHideableField } from './types.js';
|
|
2
|
+
export interface BuildEmbedUrlParams {
|
|
3
|
+
hulyUrl: string;
|
|
4
|
+
component: HulyEmbedComponent;
|
|
5
|
+
token: string;
|
|
6
|
+
project?: string;
|
|
7
|
+
issue?: string;
|
|
8
|
+
externalUser?: string;
|
|
9
|
+
parentOrigin?: string;
|
|
10
|
+
hideFields?: EmbedHideableField[];
|
|
11
|
+
}
|
|
12
|
+
export declare function buildEmbedUrl(params: BuildEmbedUrlParams): string;
|
|
13
|
+
export declare function getParentOrigin(): string;
|
|
14
|
+
//# sourceMappingURL=url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACnC;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAuBjE;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
|
package/dist/url.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export function buildEmbedUrl(params) {
|
|
2
|
+
const url = new URL('/embed', params.hulyUrl);
|
|
3
|
+
url.searchParams.set('component', params.component);
|
|
4
|
+
url.searchParams.set('token', params.token);
|
|
5
|
+
if (params.project) {
|
|
6
|
+
url.searchParams.set('project', params.project);
|
|
7
|
+
}
|
|
8
|
+
if (params.issue) {
|
|
9
|
+
url.searchParams.set('issue', params.issue);
|
|
10
|
+
}
|
|
11
|
+
if (params.externalUser) {
|
|
12
|
+
url.searchParams.set('externalUser', params.externalUser);
|
|
13
|
+
}
|
|
14
|
+
if (params.parentOrigin) {
|
|
15
|
+
url.searchParams.set('parentOrigin', params.parentOrigin);
|
|
16
|
+
}
|
|
17
|
+
if (params.hideFields && params.hideFields.length > 0) {
|
|
18
|
+
url.searchParams.set('hideFields', params.hideFields.join(','));
|
|
19
|
+
}
|
|
20
|
+
return url.toString();
|
|
21
|
+
}
|
|
22
|
+
export function getParentOrigin() {
|
|
23
|
+
return window.location.origin;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=url.js.map
|
package/dist/url.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,aAAa,CAAC,MAA2B;IACvD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAE9C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAE5C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;AAChC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@huly-embed/core",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"default": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"files": ["dist"],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"clean": "rimraf dist",
|
|
17
|
+
"test": "vitest run",
|
|
18
|
+
"test:coverage": "vitest run --coverage"
|
|
19
|
+
},
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "https://github.com/jariahh/huly-embed",
|
|
23
|
+
"directory": "packages/core"
|
|
24
|
+
},
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public"
|
|
27
|
+
},
|
|
28
|
+
"license": "EPL-2.0",
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"typescript": "~5.4.0",
|
|
31
|
+
"rimraf": "^5.0.0",
|
|
32
|
+
"vitest": "^3.0.0",
|
|
33
|
+
"@vitest/coverage-v8": "^3.0.0"
|
|
34
|
+
}
|
|
35
|
+
}
|