@azure/api-management-custom-widgets-tools 1.0.0-alpha.20250807.2 → 1.0.0-alpha.20250822.3
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/browser/utils.d.ts.map +1 -1
- package/dist/browser/utils.js +11 -11
- package/dist/browser/utils.js.map +1 -1
- package/dist/commonjs/utils.d.ts.map +1 -1
- package/dist/commonjs/utils.js +11 -11
- package/dist/commonjs/utils.js.map +1 -1
- package/dist/esm/utils.d.ts.map +1 -1
- package/dist/esm/utils.js +11 -11
- package/dist/esm/utils.js.map +1 -1
- package/package.json +27 -28
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,eAAO,MAAM,oBAAoB,eAAe,CAAC;AACjD;;GAEG;AACH,eAAO,MAAM,0BAA0B,kCAAkC,CAAC;AAC1E;;GAEG;AACH,eAAO,MAAM,gCAAgC,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,eAAO,MAAM,oBAAoB,eAAe,CAAC;AACjD;;GAEG;AACH,eAAO,MAAM,0BAA0B,kCAAkC,CAAC;AAC1E;;GAEG;AACH,eAAO,MAAM,gCAAgC,wBAAwB,CAAC;AAItE;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACnD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC;AAE7E,yEAAyE;AACzE,MAAM,WAAW,UAAU;IAGzB,kCAAkC;IAClC,WAAW,EAAE,WAAW,CAAC;IACzB,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,uEAAuE;AACvE,MAAM,WAAW,UAAU,CAAC,MAAM,SAAS,YAAY,CAAE,SAAQ,UAAU;IACzE,mDAAmD;IACnD,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB;AAyBD,wBAAgB,iBAAiB,CAAC,MAAM,SAAS,YAAY,EAC3D,eAAe,EAAE,eAAe,GAC/B,UAAU,CAAC,MAAM,CAAC,CAEpB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,SAAS,YAAY,KAAK,UAAU,CAAC,MAAM,CAAC,CAE/E;AAED,wBAAgB,mBAAmB,CAAC,MAAM,SAAS,YAAY,EAC7D,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,SAAS,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAE9E;AAED,wBAAgB,aAAa,CAAC,MAAM,SAAS,YAAY,EACvD,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,eAAe,GAC/B,MAAM,CASR;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,MAAM,SAAS,YAAY,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAEpF;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,CAAC,MAAM,SAAS,YAAY,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;AAEtF;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,SAAS,YAAY,EAC5D,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,IAAI,CAIN;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,SAAS,YAAY,KAAK,QAAQ,CAAC,MAAM,CAAC,CAG7E;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,CAAC;AAC5C;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,EAAE;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAmChF"}
|
package/dist/browser/utils.js
CHANGED
|
@@ -12,6 +12,7 @@ export const APIM_ON_CHANGE_MESSAGE_KEY = "customInputValueChangedMSAPIM";
|
|
|
12
12
|
* Key for a post message object, it's used to request and send secrets - token and user id, from the DevPortal. Used to prevent interference with other applications.
|
|
13
13
|
*/
|
|
14
14
|
export const APIM_ASK_FOR_SECRETS_MESSAGE_KEY = "askForSecretsMSAPIM";
|
|
15
|
+
const g = globalThis;
|
|
15
16
|
function parseWidgetData(urlSearchParams) {
|
|
16
17
|
try {
|
|
17
18
|
const urlEditorParams = JSON.parse(decodeURIComponent(urlSearchParams.get(APIM_EDITOR_DATA_KEY) ?? ""));
|
|
@@ -23,8 +24,7 @@ function parseWidgetData(urlSearchParams) {
|
|
|
23
24
|
return urlEditorParams;
|
|
24
25
|
}
|
|
25
26
|
catch (e) {
|
|
26
|
-
console.error(`Could not get '${APIM_EDITOR_DATA_KEY}' from the search params of the URL:\n` +
|
|
27
|
-
self.location, e);
|
|
27
|
+
console.error(`Could not get '${APIM_EDITOR_DATA_KEY}' from the search params of the URL:\n` + g.location, e);
|
|
28
28
|
return { values: {}, environment: "error", instanceId: "error" };
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -36,7 +36,7 @@ export function getWidgetDataPure(urlSearchParams) {
|
|
|
36
36
|
* Intended mostly for internal use, API might change. Consider using getValues or getEditorValues instead.
|
|
37
37
|
*/
|
|
38
38
|
export function getWidgetData() {
|
|
39
|
-
return getWidgetDataPure(new URLSearchParams(
|
|
39
|
+
return getWidgetDataPure(new URLSearchParams(g.location?.search ?? ""));
|
|
40
40
|
}
|
|
41
41
|
export function getEditorValuesPure(urlSearchParams) {
|
|
42
42
|
return getWidgetDataPure(urlSearchParams).values;
|
|
@@ -45,7 +45,7 @@ export function getEditorValuesPure(urlSearchParams) {
|
|
|
45
45
|
* Function to get values you've set in the admin editor window.
|
|
46
46
|
*/
|
|
47
47
|
export function getEditorValues() {
|
|
48
|
-
return getEditorValuesPure(new URLSearchParams(
|
|
48
|
+
return getEditorValuesPure(new URLSearchParams(g.location?.search ?? ""));
|
|
49
49
|
}
|
|
50
50
|
export function getValuesPure(valuesDefault, urlSearchParams) {
|
|
51
51
|
const values = { ...valuesDefault }; // set Obj to contain all possible values and prefill default value
|
|
@@ -63,7 +63,7 @@ export function getValuesPure(valuesDefault, urlSearchParams) {
|
|
|
63
63
|
* @param valuesDefault - object with your default values to use, just import valuesDefault object from values.ts folder
|
|
64
64
|
*/
|
|
65
65
|
export function getValues(valuesDefault) {
|
|
66
|
-
return getValuesPure(valuesDefault, new URLSearchParams(
|
|
66
|
+
return getValuesPure(valuesDefault, new URLSearchParams(g.location?.search ?? ""));
|
|
67
67
|
}
|
|
68
68
|
/**
|
|
69
69
|
* The onChange function itself with 'origin' provided as a param.
|
|
@@ -74,7 +74,7 @@ export function getValues(valuesDefault) {
|
|
|
74
74
|
*/
|
|
75
75
|
export function onChangeWithOrigin(origin, instanceId, values) {
|
|
76
76
|
Object.entries(values).forEach(([key, value]) => {
|
|
77
|
-
|
|
77
|
+
g.parent?.postMessage?.({ [APIM_ON_CHANGE_MESSAGE_KEY]: { key, value, instanceId } }, origin);
|
|
78
78
|
});
|
|
79
79
|
}
|
|
80
80
|
/**
|
|
@@ -102,21 +102,21 @@ export async function askForSecrets(targetModule) {
|
|
|
102
102
|
}
|
|
103
103
|
resolve(secrets);
|
|
104
104
|
};
|
|
105
|
-
|
|
105
|
+
g.addEventListener?.("message", receiveSecrets);
|
|
106
106
|
const message = {
|
|
107
107
|
[APIM_ASK_FOR_SECRETS_MESSAGE_KEY]: {
|
|
108
108
|
instanceId,
|
|
109
|
-
origin:
|
|
109
|
+
origin: g.location?.origin,
|
|
110
110
|
targetModule,
|
|
111
111
|
},
|
|
112
112
|
};
|
|
113
113
|
if (targetModule === "app" && environment === "development") {
|
|
114
|
-
|
|
114
|
+
g.parent?.parent?.postMessage?.(message, "*");
|
|
115
115
|
}
|
|
116
116
|
else {
|
|
117
|
-
|
|
117
|
+
g.parent?.postMessage?.(message, "*");
|
|
118
118
|
}
|
|
119
119
|
});
|
|
120
|
-
return promise.finally(() =>
|
|
120
|
+
return promise.finally(() => g.removeEventListener?.("message", receiveSecrets));
|
|
121
121
|
}
|
|
122
122
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Key for a search param, from which editor data will be loaded from.\n */\nexport const APIM_EDITOR_DATA_KEY = \"editorData\";\n/**\n * Key for a post message object, it's used to propagate changes from editor to the DevPortal. Used to prevent interference with other applications.\n */\nexport const APIM_ON_CHANGE_MESSAGE_KEY = \"customInputValueChangedMSAPIM\";\n/**\n * Key for a post message object, it's used to request and send secrets - token and user id, from the DevPortal. Used to prevent interference with other applications.\n */\nexport const APIM_ASK_FOR_SECRETS_MESSAGE_KEY = \"askForSecretsMSAPIM\";\n\n/**\n * Base of a values obj\n */\nexport type ValuesCommon = Record<string, unknown>;\n/**\n * All possible runtime environments\n */\nexport type Environment = \"development\" | \"publishing\" | \"runtime\" | \"error\";\n\n/** Information about the widget instance received from the Dev Portal */\nexport interface PortalData {\n // /** web content's origin (URL) of your Dev Portal */\n // origin: string;\n /** current runtime environment */\n environment: Environment;\n /** ID of this particular instance of the widget */\n instanceId: string;\n}\n\n/** JSON object with all the data you'll receive from the Dev Portal */\nexport interface EditorData<Values extends ValuesCommon> extends PortalData {\n /** values you've set in the admin editor window */\n values: Partial<Values>;\n}\n\nfunction parseWidgetData<Values extends ValuesCommon>(\n urlSearchParams: URLSearchParams,\n): EditorData<Values> {\n try {\n const urlEditorParams: EditorData<Values> = JSON.parse(\n decodeURIComponent(urlSearchParams.get(APIM_EDITOR_DATA_KEY) ?? \"\"),\n );\n\n // if (!(\"origin\" in urlEditorParams)) {\n // console.error(\n // \"Could not get 'origin' from the search params of the URL:\\n\" + self.location.href\n // );\n // }\n return urlEditorParams;\n } catch (e) {\n console.error(\n `Could not get '${APIM_EDITOR_DATA_KEY}' from the search params of the URL:\\n` +\n self.location,\n e,\n );\n return { values: {}, environment: \"error\", instanceId: \"error\" };\n }\n}\n\nexport function getWidgetDataPure<Values extends ValuesCommon>(\n urlSearchParams: URLSearchParams,\n): EditorData<Values> {\n return parseWidgetData<Values>(urlSearchParams);\n}\n\n/**\n * Function to get all data related to the widget including technical values not expected to be needed in most cases.\n * Intended mostly for internal use, API might change. Consider using getValues or getEditorValues instead.\n */\nexport function getWidgetData<Values extends ValuesCommon>(): EditorData<Values> {\n return getWidgetDataPure(new URLSearchParams(self.location.search));\n}\n\nexport function getEditorValuesPure<Values extends ValuesCommon>(\n urlSearchParams: URLSearchParams,\n): Partial<Values> {\n return getWidgetDataPure<Values>(urlSearchParams).values;\n}\n\n/**\n * Function to get values you've set in the admin editor window.\n */\nexport function getEditorValues<Values extends ValuesCommon>(): Partial<Values> {\n return getEditorValuesPure<Values>(new URLSearchParams(self.location.search));\n}\n\nexport function getValuesPure<Values extends ValuesCommon>(\n valuesDefault: Values,\n urlSearchParams: URLSearchParams,\n): Values {\n const values = { ...valuesDefault }; // set Obj to contain all possible values and prefill default value\n const urlValues = parseWidgetData<Values>(urlSearchParams).values;\n\n Object.keys(values).forEach((key: keyof Values) => {\n const value = urlValues[key];\n if (value != null) values[key] = value as Values[typeof key]; // if value is specified in the URL, replace the default value\n });\n return values;\n}\n\n/**\n * Function to get values you've set in the admin editor window. Undefined/empty values are replaced with default values.\n *\n * @param valuesDefault - object with your default values to use, just import valuesDefault object from values.ts folder\n */\nexport function getValues<Values extends ValuesCommon>(valuesDefault: Values): Values {\n return getValuesPure(valuesDefault, new URLSearchParams(self.location.search));\n}\n\n/**\n * Type of the onChange function.\n */\nexport type OnChange<Values extends ValuesCommon> = (values: Partial<Values>) => void;\n\n/**\n * The onChange function itself with 'origin' provided as a param.\n *\n * @param origin - web content's origin (URL) of your Dev Portal to send changes to\n * @param instanceId - ID of this particular instance of the widget\n * @param values - values that changed\n */\nexport function onChangeWithOrigin<Values extends ValuesCommon>(\n origin: string,\n instanceId: string,\n values: Values,\n): void {\n Object.entries(values).forEach(([key, value]) => {\n self.parent.postMessage({ [APIM_ON_CHANGE_MESSAGE_KEY]: { key, value, instanceId } }, origin);\n });\n}\n\n/**\n * Build onChange function, which you can use, to send changed data from the editor.\n */\nexport function buildOnChange<Values extends ValuesCommon>(): OnChange<Values> {\n const { instanceId } = getWidgetData();\n return (values: Partial<Values>) => onChangeWithOrigin(\"*\", instanceId, values);\n}\n\n/**\n * Possible target modules\n * \"app\" for main application which is embedded in your Dev Portal\n * \"editor\" for form in admin panel\n */\nexport type TargetModule = \"app\" | \"editor\";\n/**\n * Secrets needed for communication with Dev Portal back-end and other runtime data\n */\nexport type Secrets = {\n managementApiUrl: string;\n apiVersion: string;\n userId?: string;\n token?: string;\n parentLocation: {\n host: string;\n hostname: string;\n href: string;\n origin: string;\n pathname: string;\n port: string;\n protocol: string;\n search: string;\n };\n};\n\n/**\n * Request secrets - token & userId, from the Dev portal parent window.\n *\n * @param targetModule - is the function invoke from the main \"app\" window or the admin \"editor\"?\n */\nexport async function askForSecrets(targetModule: TargetModule): Promise<Secrets> {\n let receiveSecrets: (e: MessageEvent) => void;\n\n const promise = new Promise<Secrets>((resolve, reject) => {\n const { instanceId, environment }: PortalData = getWidgetData();\n\n receiveSecrets = ({ data }) => {\n if (!(APIM_ASK_FOR_SECRETS_MESSAGE_KEY in data)) return;\n\n const secrets = data[APIM_ASK_FOR_SECRETS_MESSAGE_KEY];\n if (typeof secrets !== \"object\" || !(\"managementApiUrl\" in secrets)) {\n reject(\"Secrets send by Dev Portal are invalid\");\n }\n\n resolve(secrets);\n };\n\n self.addEventListener(\"message\", receiveSecrets);\n\n const message = {\n [APIM_ASK_FOR_SECRETS_MESSAGE_KEY]: {\n instanceId,\n origin: self.location.origin,\n targetModule,\n },\n };\n\n if (targetModule === \"app\" && environment === \"development\") {\n self.parent.parent.postMessage(message, \"*\");\n } else {\n self.parent.postMessage(message, \"*\");\n }\n });\n\n return promise.finally(() => self.removeEventListener(\"message\", receiveSecrets));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Key for a search param, from which editor data will be loaded from.\n */\nexport const APIM_EDITOR_DATA_KEY = \"editorData\";\n/**\n * Key for a post message object, it's used to propagate changes from editor to the DevPortal. Used to prevent interference with other applications.\n */\nexport const APIM_ON_CHANGE_MESSAGE_KEY = \"customInputValueChangedMSAPIM\";\n/**\n * Key for a post message object, it's used to request and send secrets - token and user id, from the DevPortal. Used to prevent interference with other applications.\n */\nexport const APIM_ASK_FOR_SECRETS_MESSAGE_KEY = \"askForSecretsMSAPIM\";\n\nconst g: any = globalThis;\n\n/**\n * Base of a values obj\n */\nexport type ValuesCommon = Record<string, unknown>;\n/**\n * All possible runtime environments\n */\nexport type Environment = \"development\" | \"publishing\" | \"runtime\" | \"error\";\n\n/** Information about the widget instance received from the Dev Portal */\nexport interface PortalData {\n // /** web content's origin (URL) of your Dev Portal */\n // origin: string;\n /** current runtime environment */\n environment: Environment;\n /** ID of this particular instance of the widget */\n instanceId: string;\n}\n\n/** JSON object with all the data you'll receive from the Dev Portal */\nexport interface EditorData<Values extends ValuesCommon> extends PortalData {\n /** values you've set in the admin editor window */\n values: Partial<Values>;\n}\n\nfunction parseWidgetData<Values extends ValuesCommon>(\n urlSearchParams: URLSearchParams,\n): EditorData<Values> {\n try {\n const urlEditorParams: EditorData<Values> = JSON.parse(\n decodeURIComponent(urlSearchParams.get(APIM_EDITOR_DATA_KEY) ?? \"\"),\n );\n\n // if (!(\"origin\" in urlEditorParams)) {\n // console.error(\n // \"Could not get 'origin' from the search params of the URL:\\n\" + self.location.href\n // );\n // }\n return urlEditorParams;\n } catch (e) {\n console.error(\n `Could not get '${APIM_EDITOR_DATA_KEY}' from the search params of the URL:\\n` + g.location,\n e,\n );\n return { values: {}, environment: \"error\", instanceId: \"error\" };\n }\n}\n\nexport function getWidgetDataPure<Values extends ValuesCommon>(\n urlSearchParams: URLSearchParams,\n): EditorData<Values> {\n return parseWidgetData<Values>(urlSearchParams);\n}\n\n/**\n * Function to get all data related to the widget including technical values not expected to be needed in most cases.\n * Intended mostly for internal use, API might change. Consider using getValues or getEditorValues instead.\n */\nexport function getWidgetData<Values extends ValuesCommon>(): EditorData<Values> {\n return getWidgetDataPure(new URLSearchParams(g.location?.search ?? \"\"));\n}\n\nexport function getEditorValuesPure<Values extends ValuesCommon>(\n urlSearchParams: URLSearchParams,\n): Partial<Values> {\n return getWidgetDataPure<Values>(urlSearchParams).values;\n}\n\n/**\n * Function to get values you've set in the admin editor window.\n */\nexport function getEditorValues<Values extends ValuesCommon>(): Partial<Values> {\n return getEditorValuesPure<Values>(new URLSearchParams(g.location?.search ?? \"\"));\n}\n\nexport function getValuesPure<Values extends ValuesCommon>(\n valuesDefault: Values,\n urlSearchParams: URLSearchParams,\n): Values {\n const values = { ...valuesDefault }; // set Obj to contain all possible values and prefill default value\n const urlValues = parseWidgetData<Values>(urlSearchParams).values;\n\n Object.keys(values).forEach((key: keyof Values) => {\n const value = urlValues[key];\n if (value != null) values[key] = value as Values[typeof key]; // if value is specified in the URL, replace the default value\n });\n return values;\n}\n\n/**\n * Function to get values you've set in the admin editor window. Undefined/empty values are replaced with default values.\n *\n * @param valuesDefault - object with your default values to use, just import valuesDefault object from values.ts folder\n */\nexport function getValues<Values extends ValuesCommon>(valuesDefault: Values): Values {\n return getValuesPure(valuesDefault, new URLSearchParams(g.location?.search ?? \"\"));\n}\n\n/**\n * Type of the onChange function.\n */\nexport type OnChange<Values extends ValuesCommon> = (values: Partial<Values>) => void;\n\n/**\n * The onChange function itself with 'origin' provided as a param.\n *\n * @param origin - web content's origin (URL) of your Dev Portal to send changes to\n * @param instanceId - ID of this particular instance of the widget\n * @param values - values that changed\n */\nexport function onChangeWithOrigin<Values extends ValuesCommon>(\n origin: string,\n instanceId: string,\n values: Values,\n): void {\n Object.entries(values).forEach(([key, value]) => {\n g.parent?.postMessage?.({ [APIM_ON_CHANGE_MESSAGE_KEY]: { key, value, instanceId } }, origin);\n });\n}\n\n/**\n * Build onChange function, which you can use, to send changed data from the editor.\n */\nexport function buildOnChange<Values extends ValuesCommon>(): OnChange<Values> {\n const { instanceId } = getWidgetData();\n return (values: Partial<Values>) => onChangeWithOrigin(\"*\", instanceId, values);\n}\n\n/**\n * Possible target modules\n * \"app\" for main application which is embedded in your Dev Portal\n * \"editor\" for form in admin panel\n */\nexport type TargetModule = \"app\" | \"editor\";\n/**\n * Secrets needed for communication with Dev Portal back-end and other runtime data\n */\nexport type Secrets = {\n managementApiUrl: string;\n apiVersion: string;\n userId?: string;\n token?: string;\n parentLocation: {\n host: string;\n hostname: string;\n href: string;\n origin: string;\n pathname: string;\n port: string;\n protocol: string;\n search: string;\n };\n};\n\n/**\n * Request secrets - token & userId, from the Dev portal parent window.\n *\n * @param targetModule - is the function invoke from the main \"app\" window or the admin \"editor\"?\n */\nexport async function askForSecrets(targetModule: TargetModule): Promise<Secrets> {\n let receiveSecrets: (e: MessageEvent) => void;\n\n const promise = new Promise<Secrets>((resolve, reject) => {\n const { instanceId, environment }: PortalData = getWidgetData();\n\n receiveSecrets = ({ data }) => {\n if (!(APIM_ASK_FOR_SECRETS_MESSAGE_KEY in data)) return;\n\n const secrets = data[APIM_ASK_FOR_SECRETS_MESSAGE_KEY];\n if (typeof secrets !== \"object\" || !(\"managementApiUrl\" in secrets)) {\n reject(\"Secrets send by Dev Portal are invalid\");\n }\n\n resolve(secrets);\n };\n\n g.addEventListener?.(\"message\", receiveSecrets);\n\n const message = {\n [APIM_ASK_FOR_SECRETS_MESSAGE_KEY]: {\n instanceId,\n origin: g.location?.origin,\n targetModule,\n },\n };\n\n if (targetModule === \"app\" && environment === \"development\") {\n g.parent?.parent?.postMessage?.(message, \"*\");\n } else {\n g.parent?.postMessage?.(message, \"*\");\n }\n });\n\n return promise.finally(() => g.removeEventListener?.(\"message\", receiveSecrets));\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,eAAO,MAAM,oBAAoB,eAAe,CAAC;AACjD;;GAEG;AACH,eAAO,MAAM,0BAA0B,kCAAkC,CAAC;AAC1E;;GAEG;AACH,eAAO,MAAM,gCAAgC,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,eAAO,MAAM,oBAAoB,eAAe,CAAC;AACjD;;GAEG;AACH,eAAO,MAAM,0BAA0B,kCAAkC,CAAC;AAC1E;;GAEG;AACH,eAAO,MAAM,gCAAgC,wBAAwB,CAAC;AAItE;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACnD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC;AAE7E,yEAAyE;AACzE,MAAM,WAAW,UAAU;IAGzB,kCAAkC;IAClC,WAAW,EAAE,WAAW,CAAC;IACzB,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,uEAAuE;AACvE,MAAM,WAAW,UAAU,CAAC,MAAM,SAAS,YAAY,CAAE,SAAQ,UAAU;IACzE,mDAAmD;IACnD,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB;AAyBD,wBAAgB,iBAAiB,CAAC,MAAM,SAAS,YAAY,EAC3D,eAAe,EAAE,eAAe,GAC/B,UAAU,CAAC,MAAM,CAAC,CAEpB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,SAAS,YAAY,KAAK,UAAU,CAAC,MAAM,CAAC,CAE/E;AAED,wBAAgB,mBAAmB,CAAC,MAAM,SAAS,YAAY,EAC7D,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,SAAS,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAE9E;AAED,wBAAgB,aAAa,CAAC,MAAM,SAAS,YAAY,EACvD,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,eAAe,GAC/B,MAAM,CASR;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,MAAM,SAAS,YAAY,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAEpF;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,CAAC,MAAM,SAAS,YAAY,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;AAEtF;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,SAAS,YAAY,EAC5D,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,IAAI,CAIN;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,SAAS,YAAY,KAAK,QAAQ,CAAC,MAAM,CAAC,CAG7E;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,CAAC;AAC5C;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,EAAE;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAmChF"}
|
package/dist/commonjs/utils.js
CHANGED
|
@@ -24,6 +24,7 @@ exports.APIM_ON_CHANGE_MESSAGE_KEY = "customInputValueChangedMSAPIM";
|
|
|
24
24
|
* Key for a post message object, it's used to request and send secrets - token and user id, from the DevPortal. Used to prevent interference with other applications.
|
|
25
25
|
*/
|
|
26
26
|
exports.APIM_ASK_FOR_SECRETS_MESSAGE_KEY = "askForSecretsMSAPIM";
|
|
27
|
+
const g = globalThis;
|
|
27
28
|
function parseWidgetData(urlSearchParams) {
|
|
28
29
|
try {
|
|
29
30
|
const urlEditorParams = JSON.parse(decodeURIComponent(urlSearchParams.get(exports.APIM_EDITOR_DATA_KEY) ?? ""));
|
|
@@ -35,8 +36,7 @@ function parseWidgetData(urlSearchParams) {
|
|
|
35
36
|
return urlEditorParams;
|
|
36
37
|
}
|
|
37
38
|
catch (e) {
|
|
38
|
-
console.error(`Could not get '${exports.APIM_EDITOR_DATA_KEY}' from the search params of the URL:\n` +
|
|
39
|
-
self.location, e);
|
|
39
|
+
console.error(`Could not get '${exports.APIM_EDITOR_DATA_KEY}' from the search params of the URL:\n` + g.location, e);
|
|
40
40
|
return { values: {}, environment: "error", instanceId: "error" };
|
|
41
41
|
}
|
|
42
42
|
}
|
|
@@ -48,7 +48,7 @@ function getWidgetDataPure(urlSearchParams) {
|
|
|
48
48
|
* Intended mostly for internal use, API might change. Consider using getValues or getEditorValues instead.
|
|
49
49
|
*/
|
|
50
50
|
function getWidgetData() {
|
|
51
|
-
return getWidgetDataPure(new URLSearchParams(
|
|
51
|
+
return getWidgetDataPure(new URLSearchParams(g.location?.search ?? ""));
|
|
52
52
|
}
|
|
53
53
|
function getEditorValuesPure(urlSearchParams) {
|
|
54
54
|
return getWidgetDataPure(urlSearchParams).values;
|
|
@@ -57,7 +57,7 @@ function getEditorValuesPure(urlSearchParams) {
|
|
|
57
57
|
* Function to get values you've set in the admin editor window.
|
|
58
58
|
*/
|
|
59
59
|
function getEditorValues() {
|
|
60
|
-
return getEditorValuesPure(new URLSearchParams(
|
|
60
|
+
return getEditorValuesPure(new URLSearchParams(g.location?.search ?? ""));
|
|
61
61
|
}
|
|
62
62
|
function getValuesPure(valuesDefault, urlSearchParams) {
|
|
63
63
|
const values = { ...valuesDefault }; // set Obj to contain all possible values and prefill default value
|
|
@@ -75,7 +75,7 @@ function getValuesPure(valuesDefault, urlSearchParams) {
|
|
|
75
75
|
* @param valuesDefault - object with your default values to use, just import valuesDefault object from values.ts folder
|
|
76
76
|
*/
|
|
77
77
|
function getValues(valuesDefault) {
|
|
78
|
-
return getValuesPure(valuesDefault, new URLSearchParams(
|
|
78
|
+
return getValuesPure(valuesDefault, new URLSearchParams(g.location?.search ?? ""));
|
|
79
79
|
}
|
|
80
80
|
/**
|
|
81
81
|
* The onChange function itself with 'origin' provided as a param.
|
|
@@ -86,7 +86,7 @@ function getValues(valuesDefault) {
|
|
|
86
86
|
*/
|
|
87
87
|
function onChangeWithOrigin(origin, instanceId, values) {
|
|
88
88
|
Object.entries(values).forEach(([key, value]) => {
|
|
89
|
-
|
|
89
|
+
g.parent?.postMessage?.({ [exports.APIM_ON_CHANGE_MESSAGE_KEY]: { key, value, instanceId } }, origin);
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
92
|
/**
|
|
@@ -114,21 +114,21 @@ async function askForSecrets(targetModule) {
|
|
|
114
114
|
}
|
|
115
115
|
resolve(secrets);
|
|
116
116
|
};
|
|
117
|
-
|
|
117
|
+
g.addEventListener?.("message", receiveSecrets);
|
|
118
118
|
const message = {
|
|
119
119
|
[exports.APIM_ASK_FOR_SECRETS_MESSAGE_KEY]: {
|
|
120
120
|
instanceId,
|
|
121
|
-
origin:
|
|
121
|
+
origin: g.location?.origin,
|
|
122
122
|
targetModule,
|
|
123
123
|
},
|
|
124
124
|
};
|
|
125
125
|
if (targetModule === "app" && environment === "development") {
|
|
126
|
-
|
|
126
|
+
g.parent?.parent?.postMessage?.(message, "*");
|
|
127
127
|
}
|
|
128
128
|
else {
|
|
129
|
-
|
|
129
|
+
g.parent?.postMessage?.(message, "*");
|
|
130
130
|
}
|
|
131
131
|
});
|
|
132
|
-
return promise.finally(() =>
|
|
132
|
+
return promise.finally(() => g.removeEventListener?.("message", receiveSecrets));
|
|
133
133
|
}
|
|
134
134
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Key for a search param, from which editor data will be loaded from.\n */\nexport const APIM_EDITOR_DATA_KEY = \"editorData\";\n/**\n * Key for a post message object, it's used to propagate changes from editor to the DevPortal. Used to prevent interference with other applications.\n */\nexport const APIM_ON_CHANGE_MESSAGE_KEY = \"customInputValueChangedMSAPIM\";\n/**\n * Key for a post message object, it's used to request and send secrets - token and user id, from the DevPortal. Used to prevent interference with other applications.\n */\nexport const APIM_ASK_FOR_SECRETS_MESSAGE_KEY = \"askForSecretsMSAPIM\";\n\n/**\n * Base of a values obj\n */\nexport type ValuesCommon = Record<string, unknown>;\n/**\n * All possible runtime environments\n */\nexport type Environment = \"development\" | \"publishing\" | \"runtime\" | \"error\";\n\n/** Information about the widget instance received from the Dev Portal */\nexport interface PortalData {\n // /** web content's origin (URL) of your Dev Portal */\n // origin: string;\n /** current runtime environment */\n environment: Environment;\n /** ID of this particular instance of the widget */\n instanceId: string;\n}\n\n/** JSON object with all the data you'll receive from the Dev Portal */\nexport interface EditorData<Values extends ValuesCommon> extends PortalData {\n /** values you've set in the admin editor window */\n values: Partial<Values>;\n}\n\nfunction parseWidgetData<Values extends ValuesCommon>(\n urlSearchParams: URLSearchParams,\n): EditorData<Values> {\n try {\n const urlEditorParams: EditorData<Values> = JSON.parse(\n decodeURIComponent(urlSearchParams.get(APIM_EDITOR_DATA_KEY) ?? \"\"),\n );\n\n // if (!(\"origin\" in urlEditorParams)) {\n // console.error(\n // \"Could not get 'origin' from the search params of the URL:\\n\" + self.location.href\n // );\n // }\n return urlEditorParams;\n } catch (e) {\n console.error(\n `Could not get '${APIM_EDITOR_DATA_KEY}' from the search params of the URL:\\n` +\n self.location,\n e,\n );\n return { values: {}, environment: \"error\", instanceId: \"error\" };\n }\n}\n\nexport function getWidgetDataPure<Values extends ValuesCommon>(\n urlSearchParams: URLSearchParams,\n): EditorData<Values> {\n return parseWidgetData<Values>(urlSearchParams);\n}\n\n/**\n * Function to get all data related to the widget including technical values not expected to be needed in most cases.\n * Intended mostly for internal use, API might change. Consider using getValues or getEditorValues instead.\n */\nexport function getWidgetData<Values extends ValuesCommon>(): EditorData<Values> {\n return getWidgetDataPure(new URLSearchParams(self.location.search));\n}\n\nexport function getEditorValuesPure<Values extends ValuesCommon>(\n urlSearchParams: URLSearchParams,\n): Partial<Values> {\n return getWidgetDataPure<Values>(urlSearchParams).values;\n}\n\n/**\n * Function to get values you've set in the admin editor window.\n */\nexport function getEditorValues<Values extends ValuesCommon>(): Partial<Values> {\n return getEditorValuesPure<Values>(new URLSearchParams(self.location.search));\n}\n\nexport function getValuesPure<Values extends ValuesCommon>(\n valuesDefault: Values,\n urlSearchParams: URLSearchParams,\n): Values {\n const values = { ...valuesDefault }; // set Obj to contain all possible values and prefill default value\n const urlValues = parseWidgetData<Values>(urlSearchParams).values;\n\n Object.keys(values).forEach((key: keyof Values) => {\n const value = urlValues[key];\n if (value != null) values[key] = value as Values[typeof key]; // if value is specified in the URL, replace the default value\n });\n return values;\n}\n\n/**\n * Function to get values you've set in the admin editor window. Undefined/empty values are replaced with default values.\n *\n * @param valuesDefault - object with your default values to use, just import valuesDefault object from values.ts folder\n */\nexport function getValues<Values extends ValuesCommon>(valuesDefault: Values): Values {\n return getValuesPure(valuesDefault, new URLSearchParams(self.location.search));\n}\n\n/**\n * Type of the onChange function.\n */\nexport type OnChange<Values extends ValuesCommon> = (values: Partial<Values>) => void;\n\n/**\n * The onChange function itself with 'origin' provided as a param.\n *\n * @param origin - web content's origin (URL) of your Dev Portal to send changes to\n * @param instanceId - ID of this particular instance of the widget\n * @param values - values that changed\n */\nexport function onChangeWithOrigin<Values extends ValuesCommon>(\n origin: string,\n instanceId: string,\n values: Values,\n): void {\n Object.entries(values).forEach(([key, value]) => {\n self.parent.postMessage({ [APIM_ON_CHANGE_MESSAGE_KEY]: { key, value, instanceId } }, origin);\n });\n}\n\n/**\n * Build onChange function, which you can use, to send changed data from the editor.\n */\nexport function buildOnChange<Values extends ValuesCommon>(): OnChange<Values> {\n const { instanceId } = getWidgetData();\n return (values: Partial<Values>) => onChangeWithOrigin(\"*\", instanceId, values);\n}\n\n/**\n * Possible target modules\n * \"app\" for main application which is embedded in your Dev Portal\n * \"editor\" for form in admin panel\n */\nexport type TargetModule = \"app\" | \"editor\";\n/**\n * Secrets needed for communication with Dev Portal back-end and other runtime data\n */\nexport type Secrets = {\n managementApiUrl: string;\n apiVersion: string;\n userId?: string;\n token?: string;\n parentLocation: {\n host: string;\n hostname: string;\n href: string;\n origin: string;\n pathname: string;\n port: string;\n protocol: string;\n search: string;\n };\n};\n\n/**\n * Request secrets - token & userId, from the Dev portal parent window.\n *\n * @param targetModule - is the function invoke from the main \"app\" window or the admin \"editor\"?\n */\nexport async function askForSecrets(targetModule: TargetModule): Promise<Secrets> {\n let receiveSecrets: (e: MessageEvent) => void;\n\n const promise = new Promise<Secrets>((resolve, reject) => {\n const { instanceId, environment }: PortalData = getWidgetData();\n\n receiveSecrets = ({ data }) => {\n if (!(APIM_ASK_FOR_SECRETS_MESSAGE_KEY in data)) return;\n\n const secrets = data[APIM_ASK_FOR_SECRETS_MESSAGE_KEY];\n if (typeof secrets !== \"object\" || !(\"managementApiUrl\" in secrets)) {\n reject(\"Secrets send by Dev Portal are invalid\");\n }\n\n resolve(secrets);\n };\n\n self.addEventListener(\"message\", receiveSecrets);\n\n const message = {\n [APIM_ASK_FOR_SECRETS_MESSAGE_KEY]: {\n instanceId,\n origin: self.location.origin,\n targetModule,\n },\n };\n\n if (targetModule === \"app\" && environment === \"development\") {\n self.parent.parent.postMessage(message, \"*\");\n } else {\n self.parent.postMessage(message, \"*\");\n }\n });\n\n return promise.finally(() => self.removeEventListener(\"message\", receiveSecrets));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Key for a search param, from which editor data will be loaded from.\n */\nexport const APIM_EDITOR_DATA_KEY = \"editorData\";\n/**\n * Key for a post message object, it's used to propagate changes from editor to the DevPortal. Used to prevent interference with other applications.\n */\nexport const APIM_ON_CHANGE_MESSAGE_KEY = \"customInputValueChangedMSAPIM\";\n/**\n * Key for a post message object, it's used to request and send secrets - token and user id, from the DevPortal. Used to prevent interference with other applications.\n */\nexport const APIM_ASK_FOR_SECRETS_MESSAGE_KEY = \"askForSecretsMSAPIM\";\n\nconst g: any = globalThis;\n\n/**\n * Base of a values obj\n */\nexport type ValuesCommon = Record<string, unknown>;\n/**\n * All possible runtime environments\n */\nexport type Environment = \"development\" | \"publishing\" | \"runtime\" | \"error\";\n\n/** Information about the widget instance received from the Dev Portal */\nexport interface PortalData {\n // /** web content's origin (URL) of your Dev Portal */\n // origin: string;\n /** current runtime environment */\n environment: Environment;\n /** ID of this particular instance of the widget */\n instanceId: string;\n}\n\n/** JSON object with all the data you'll receive from the Dev Portal */\nexport interface EditorData<Values extends ValuesCommon> extends PortalData {\n /** values you've set in the admin editor window */\n values: Partial<Values>;\n}\n\nfunction parseWidgetData<Values extends ValuesCommon>(\n urlSearchParams: URLSearchParams,\n): EditorData<Values> {\n try {\n const urlEditorParams: EditorData<Values> = JSON.parse(\n decodeURIComponent(urlSearchParams.get(APIM_EDITOR_DATA_KEY) ?? \"\"),\n );\n\n // if (!(\"origin\" in urlEditorParams)) {\n // console.error(\n // \"Could not get 'origin' from the search params of the URL:\\n\" + self.location.href\n // );\n // }\n return urlEditorParams;\n } catch (e) {\n console.error(\n `Could not get '${APIM_EDITOR_DATA_KEY}' from the search params of the URL:\\n` + g.location,\n e,\n );\n return { values: {}, environment: \"error\", instanceId: \"error\" };\n }\n}\n\nexport function getWidgetDataPure<Values extends ValuesCommon>(\n urlSearchParams: URLSearchParams,\n): EditorData<Values> {\n return parseWidgetData<Values>(urlSearchParams);\n}\n\n/**\n * Function to get all data related to the widget including technical values not expected to be needed in most cases.\n * Intended mostly for internal use, API might change. Consider using getValues or getEditorValues instead.\n */\nexport function getWidgetData<Values extends ValuesCommon>(): EditorData<Values> {\n return getWidgetDataPure(new URLSearchParams(g.location?.search ?? \"\"));\n}\n\nexport function getEditorValuesPure<Values extends ValuesCommon>(\n urlSearchParams: URLSearchParams,\n): Partial<Values> {\n return getWidgetDataPure<Values>(urlSearchParams).values;\n}\n\n/**\n * Function to get values you've set in the admin editor window.\n */\nexport function getEditorValues<Values extends ValuesCommon>(): Partial<Values> {\n return getEditorValuesPure<Values>(new URLSearchParams(g.location?.search ?? \"\"));\n}\n\nexport function getValuesPure<Values extends ValuesCommon>(\n valuesDefault: Values,\n urlSearchParams: URLSearchParams,\n): Values {\n const values = { ...valuesDefault }; // set Obj to contain all possible values and prefill default value\n const urlValues = parseWidgetData<Values>(urlSearchParams).values;\n\n Object.keys(values).forEach((key: keyof Values) => {\n const value = urlValues[key];\n if (value != null) values[key] = value as Values[typeof key]; // if value is specified in the URL, replace the default value\n });\n return values;\n}\n\n/**\n * Function to get values you've set in the admin editor window. Undefined/empty values are replaced with default values.\n *\n * @param valuesDefault - object with your default values to use, just import valuesDefault object from values.ts folder\n */\nexport function getValues<Values extends ValuesCommon>(valuesDefault: Values): Values {\n return getValuesPure(valuesDefault, new URLSearchParams(g.location?.search ?? \"\"));\n}\n\n/**\n * Type of the onChange function.\n */\nexport type OnChange<Values extends ValuesCommon> = (values: Partial<Values>) => void;\n\n/**\n * The onChange function itself with 'origin' provided as a param.\n *\n * @param origin - web content's origin (URL) of your Dev Portal to send changes to\n * @param instanceId - ID of this particular instance of the widget\n * @param values - values that changed\n */\nexport function onChangeWithOrigin<Values extends ValuesCommon>(\n origin: string,\n instanceId: string,\n values: Values,\n): void {\n Object.entries(values).forEach(([key, value]) => {\n g.parent?.postMessage?.({ [APIM_ON_CHANGE_MESSAGE_KEY]: { key, value, instanceId } }, origin);\n });\n}\n\n/**\n * Build onChange function, which you can use, to send changed data from the editor.\n */\nexport function buildOnChange<Values extends ValuesCommon>(): OnChange<Values> {\n const { instanceId } = getWidgetData();\n return (values: Partial<Values>) => onChangeWithOrigin(\"*\", instanceId, values);\n}\n\n/**\n * Possible target modules\n * \"app\" for main application which is embedded in your Dev Portal\n * \"editor\" for form in admin panel\n */\nexport type TargetModule = \"app\" | \"editor\";\n/**\n * Secrets needed for communication with Dev Portal back-end and other runtime data\n */\nexport type Secrets = {\n managementApiUrl: string;\n apiVersion: string;\n userId?: string;\n token?: string;\n parentLocation: {\n host: string;\n hostname: string;\n href: string;\n origin: string;\n pathname: string;\n port: string;\n protocol: string;\n search: string;\n };\n};\n\n/**\n * Request secrets - token & userId, from the Dev portal parent window.\n *\n * @param targetModule - is the function invoke from the main \"app\" window or the admin \"editor\"?\n */\nexport async function askForSecrets(targetModule: TargetModule): Promise<Secrets> {\n let receiveSecrets: (e: MessageEvent) => void;\n\n const promise = new Promise<Secrets>((resolve, reject) => {\n const { instanceId, environment }: PortalData = getWidgetData();\n\n receiveSecrets = ({ data }) => {\n if (!(APIM_ASK_FOR_SECRETS_MESSAGE_KEY in data)) return;\n\n const secrets = data[APIM_ASK_FOR_SECRETS_MESSAGE_KEY];\n if (typeof secrets !== \"object\" || !(\"managementApiUrl\" in secrets)) {\n reject(\"Secrets send by Dev Portal are invalid\");\n }\n\n resolve(secrets);\n };\n\n g.addEventListener?.(\"message\", receiveSecrets);\n\n const message = {\n [APIM_ASK_FOR_SECRETS_MESSAGE_KEY]: {\n instanceId,\n origin: g.location?.origin,\n targetModule,\n },\n };\n\n if (targetModule === \"app\" && environment === \"development\") {\n g.parent?.parent?.postMessage?.(message, \"*\");\n } else {\n g.parent?.postMessage?.(message, \"*\");\n }\n });\n\n return promise.finally(() => g.removeEventListener?.(\"message\", receiveSecrets));\n}\n"]}
|
package/dist/esm/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,eAAO,MAAM,oBAAoB,eAAe,CAAC;AACjD;;GAEG;AACH,eAAO,MAAM,0BAA0B,kCAAkC,CAAC;AAC1E;;GAEG;AACH,eAAO,MAAM,gCAAgC,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,eAAO,MAAM,oBAAoB,eAAe,CAAC;AACjD;;GAEG;AACH,eAAO,MAAM,0BAA0B,kCAAkC,CAAC;AAC1E;;GAEG;AACH,eAAO,MAAM,gCAAgC,wBAAwB,CAAC;AAItE;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACnD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC;AAE7E,yEAAyE;AACzE,MAAM,WAAW,UAAU;IAGzB,kCAAkC;IAClC,WAAW,EAAE,WAAW,CAAC;IACzB,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,uEAAuE;AACvE,MAAM,WAAW,UAAU,CAAC,MAAM,SAAS,YAAY,CAAE,SAAQ,UAAU;IACzE,mDAAmD;IACnD,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB;AAyBD,wBAAgB,iBAAiB,CAAC,MAAM,SAAS,YAAY,EAC3D,eAAe,EAAE,eAAe,GAC/B,UAAU,CAAC,MAAM,CAAC,CAEpB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,SAAS,YAAY,KAAK,UAAU,CAAC,MAAM,CAAC,CAE/E;AAED,wBAAgB,mBAAmB,CAAC,MAAM,SAAS,YAAY,EAC7D,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,SAAS,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAE9E;AAED,wBAAgB,aAAa,CAAC,MAAM,SAAS,YAAY,EACvD,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,eAAe,GAC/B,MAAM,CASR;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,MAAM,SAAS,YAAY,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAEpF;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,CAAC,MAAM,SAAS,YAAY,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;AAEtF;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,SAAS,YAAY,EAC5D,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,IAAI,CAIN;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,SAAS,YAAY,KAAK,QAAQ,CAAC,MAAM,CAAC,CAG7E;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,CAAC;AAC5C;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,EAAE;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAmChF"}
|
package/dist/esm/utils.js
CHANGED
|
@@ -12,6 +12,7 @@ export const APIM_ON_CHANGE_MESSAGE_KEY = "customInputValueChangedMSAPIM";
|
|
|
12
12
|
* Key for a post message object, it's used to request and send secrets - token and user id, from the DevPortal. Used to prevent interference with other applications.
|
|
13
13
|
*/
|
|
14
14
|
export const APIM_ASK_FOR_SECRETS_MESSAGE_KEY = "askForSecretsMSAPIM";
|
|
15
|
+
const g = globalThis;
|
|
15
16
|
function parseWidgetData(urlSearchParams) {
|
|
16
17
|
try {
|
|
17
18
|
const urlEditorParams = JSON.parse(decodeURIComponent(urlSearchParams.get(APIM_EDITOR_DATA_KEY) ?? ""));
|
|
@@ -23,8 +24,7 @@ function parseWidgetData(urlSearchParams) {
|
|
|
23
24
|
return urlEditorParams;
|
|
24
25
|
}
|
|
25
26
|
catch (e) {
|
|
26
|
-
console.error(`Could not get '${APIM_EDITOR_DATA_KEY}' from the search params of the URL:\n` +
|
|
27
|
-
self.location, e);
|
|
27
|
+
console.error(`Could not get '${APIM_EDITOR_DATA_KEY}' from the search params of the URL:\n` + g.location, e);
|
|
28
28
|
return { values: {}, environment: "error", instanceId: "error" };
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -36,7 +36,7 @@ export function getWidgetDataPure(urlSearchParams) {
|
|
|
36
36
|
* Intended mostly for internal use, API might change. Consider using getValues or getEditorValues instead.
|
|
37
37
|
*/
|
|
38
38
|
export function getWidgetData() {
|
|
39
|
-
return getWidgetDataPure(new URLSearchParams(
|
|
39
|
+
return getWidgetDataPure(new URLSearchParams(g.location?.search ?? ""));
|
|
40
40
|
}
|
|
41
41
|
export function getEditorValuesPure(urlSearchParams) {
|
|
42
42
|
return getWidgetDataPure(urlSearchParams).values;
|
|
@@ -45,7 +45,7 @@ export function getEditorValuesPure(urlSearchParams) {
|
|
|
45
45
|
* Function to get values you've set in the admin editor window.
|
|
46
46
|
*/
|
|
47
47
|
export function getEditorValues() {
|
|
48
|
-
return getEditorValuesPure(new URLSearchParams(
|
|
48
|
+
return getEditorValuesPure(new URLSearchParams(g.location?.search ?? ""));
|
|
49
49
|
}
|
|
50
50
|
export function getValuesPure(valuesDefault, urlSearchParams) {
|
|
51
51
|
const values = { ...valuesDefault }; // set Obj to contain all possible values and prefill default value
|
|
@@ -63,7 +63,7 @@ export function getValuesPure(valuesDefault, urlSearchParams) {
|
|
|
63
63
|
* @param valuesDefault - object with your default values to use, just import valuesDefault object from values.ts folder
|
|
64
64
|
*/
|
|
65
65
|
export function getValues(valuesDefault) {
|
|
66
|
-
return getValuesPure(valuesDefault, new URLSearchParams(
|
|
66
|
+
return getValuesPure(valuesDefault, new URLSearchParams(g.location?.search ?? ""));
|
|
67
67
|
}
|
|
68
68
|
/**
|
|
69
69
|
* The onChange function itself with 'origin' provided as a param.
|
|
@@ -74,7 +74,7 @@ export function getValues(valuesDefault) {
|
|
|
74
74
|
*/
|
|
75
75
|
export function onChangeWithOrigin(origin, instanceId, values) {
|
|
76
76
|
Object.entries(values).forEach(([key, value]) => {
|
|
77
|
-
|
|
77
|
+
g.parent?.postMessage?.({ [APIM_ON_CHANGE_MESSAGE_KEY]: { key, value, instanceId } }, origin);
|
|
78
78
|
});
|
|
79
79
|
}
|
|
80
80
|
/**
|
|
@@ -102,21 +102,21 @@ export async function askForSecrets(targetModule) {
|
|
|
102
102
|
}
|
|
103
103
|
resolve(secrets);
|
|
104
104
|
};
|
|
105
|
-
|
|
105
|
+
g.addEventListener?.("message", receiveSecrets);
|
|
106
106
|
const message = {
|
|
107
107
|
[APIM_ASK_FOR_SECRETS_MESSAGE_KEY]: {
|
|
108
108
|
instanceId,
|
|
109
|
-
origin:
|
|
109
|
+
origin: g.location?.origin,
|
|
110
110
|
targetModule,
|
|
111
111
|
},
|
|
112
112
|
};
|
|
113
113
|
if (targetModule === "app" && environment === "development") {
|
|
114
|
-
|
|
114
|
+
g.parent?.parent?.postMessage?.(message, "*");
|
|
115
115
|
}
|
|
116
116
|
else {
|
|
117
|
-
|
|
117
|
+
g.parent?.postMessage?.(message, "*");
|
|
118
118
|
}
|
|
119
119
|
});
|
|
120
|
-
return promise.finally(() =>
|
|
120
|
+
return promise.finally(() => g.removeEventListener?.("message", receiveSecrets));
|
|
121
121
|
}
|
|
122
122
|
//# sourceMappingURL=utils.js.map
|
package/dist/esm/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Key for a search param, from which editor data will be loaded from.\n */\nexport const APIM_EDITOR_DATA_KEY = \"editorData\";\n/**\n * Key for a post message object, it's used to propagate changes from editor to the DevPortal. Used to prevent interference with other applications.\n */\nexport const APIM_ON_CHANGE_MESSAGE_KEY = \"customInputValueChangedMSAPIM\";\n/**\n * Key for a post message object, it's used to request and send secrets - token and user id, from the DevPortal. Used to prevent interference with other applications.\n */\nexport const APIM_ASK_FOR_SECRETS_MESSAGE_KEY = \"askForSecretsMSAPIM\";\n\n/**\n * Base of a values obj\n */\nexport type ValuesCommon = Record<string, unknown>;\n/**\n * All possible runtime environments\n */\nexport type Environment = \"development\" | \"publishing\" | \"runtime\" | \"error\";\n\n/** Information about the widget instance received from the Dev Portal */\nexport interface PortalData {\n // /** web content's origin (URL) of your Dev Portal */\n // origin: string;\n /** current runtime environment */\n environment: Environment;\n /** ID of this particular instance of the widget */\n instanceId: string;\n}\n\n/** JSON object with all the data you'll receive from the Dev Portal */\nexport interface EditorData<Values extends ValuesCommon> extends PortalData {\n /** values you've set in the admin editor window */\n values: Partial<Values>;\n}\n\nfunction parseWidgetData<Values extends ValuesCommon>(\n urlSearchParams: URLSearchParams,\n): EditorData<Values> {\n try {\n const urlEditorParams: EditorData<Values> = JSON.parse(\n decodeURIComponent(urlSearchParams.get(APIM_EDITOR_DATA_KEY) ?? \"\"),\n );\n\n // if (!(\"origin\" in urlEditorParams)) {\n // console.error(\n // \"Could not get 'origin' from the search params of the URL:\\n\" + self.location.href\n // );\n // }\n return urlEditorParams;\n } catch (e) {\n console.error(\n `Could not get '${APIM_EDITOR_DATA_KEY}' from the search params of the URL:\\n` +\n self.location,\n e,\n );\n return { values: {}, environment: \"error\", instanceId: \"error\" };\n }\n}\n\nexport function getWidgetDataPure<Values extends ValuesCommon>(\n urlSearchParams: URLSearchParams,\n): EditorData<Values> {\n return parseWidgetData<Values>(urlSearchParams);\n}\n\n/**\n * Function to get all data related to the widget including technical values not expected to be needed in most cases.\n * Intended mostly for internal use, API might change. Consider using getValues or getEditorValues instead.\n */\nexport function getWidgetData<Values extends ValuesCommon>(): EditorData<Values> {\n return getWidgetDataPure(new URLSearchParams(self.location.search));\n}\n\nexport function getEditorValuesPure<Values extends ValuesCommon>(\n urlSearchParams: URLSearchParams,\n): Partial<Values> {\n return getWidgetDataPure<Values>(urlSearchParams).values;\n}\n\n/**\n * Function to get values you've set in the admin editor window.\n */\nexport function getEditorValues<Values extends ValuesCommon>(): Partial<Values> {\n return getEditorValuesPure<Values>(new URLSearchParams(self.location.search));\n}\n\nexport function getValuesPure<Values extends ValuesCommon>(\n valuesDefault: Values,\n urlSearchParams: URLSearchParams,\n): Values {\n const values = { ...valuesDefault }; // set Obj to contain all possible values and prefill default value\n const urlValues = parseWidgetData<Values>(urlSearchParams).values;\n\n Object.keys(values).forEach((key: keyof Values) => {\n const value = urlValues[key];\n if (value != null) values[key] = value as Values[typeof key]; // if value is specified in the URL, replace the default value\n });\n return values;\n}\n\n/**\n * Function to get values you've set in the admin editor window. Undefined/empty values are replaced with default values.\n *\n * @param valuesDefault - object with your default values to use, just import valuesDefault object from values.ts folder\n */\nexport function getValues<Values extends ValuesCommon>(valuesDefault: Values): Values {\n return getValuesPure(valuesDefault, new URLSearchParams(self.location.search));\n}\n\n/**\n * Type of the onChange function.\n */\nexport type OnChange<Values extends ValuesCommon> = (values: Partial<Values>) => void;\n\n/**\n * The onChange function itself with 'origin' provided as a param.\n *\n * @param origin - web content's origin (URL) of your Dev Portal to send changes to\n * @param instanceId - ID of this particular instance of the widget\n * @param values - values that changed\n */\nexport function onChangeWithOrigin<Values extends ValuesCommon>(\n origin: string,\n instanceId: string,\n values: Values,\n): void {\n Object.entries(values).forEach(([key, value]) => {\n self.parent.postMessage({ [APIM_ON_CHANGE_MESSAGE_KEY]: { key, value, instanceId } }, origin);\n });\n}\n\n/**\n * Build onChange function, which you can use, to send changed data from the editor.\n */\nexport function buildOnChange<Values extends ValuesCommon>(): OnChange<Values> {\n const { instanceId } = getWidgetData();\n return (values: Partial<Values>) => onChangeWithOrigin(\"*\", instanceId, values);\n}\n\n/**\n * Possible target modules\n * \"app\" for main application which is embedded in your Dev Portal\n * \"editor\" for form in admin panel\n */\nexport type TargetModule = \"app\" | \"editor\";\n/**\n * Secrets needed for communication with Dev Portal back-end and other runtime data\n */\nexport type Secrets = {\n managementApiUrl: string;\n apiVersion: string;\n userId?: string;\n token?: string;\n parentLocation: {\n host: string;\n hostname: string;\n href: string;\n origin: string;\n pathname: string;\n port: string;\n protocol: string;\n search: string;\n };\n};\n\n/**\n * Request secrets - token & userId, from the Dev portal parent window.\n *\n * @param targetModule - is the function invoke from the main \"app\" window or the admin \"editor\"?\n */\nexport async function askForSecrets(targetModule: TargetModule): Promise<Secrets> {\n let receiveSecrets: (e: MessageEvent) => void;\n\n const promise = new Promise<Secrets>((resolve, reject) => {\n const { instanceId, environment }: PortalData = getWidgetData();\n\n receiveSecrets = ({ data }) => {\n if (!(APIM_ASK_FOR_SECRETS_MESSAGE_KEY in data)) return;\n\n const secrets = data[APIM_ASK_FOR_SECRETS_MESSAGE_KEY];\n if (typeof secrets !== \"object\" || !(\"managementApiUrl\" in secrets)) {\n reject(\"Secrets send by Dev Portal are invalid\");\n }\n\n resolve(secrets);\n };\n\n self.addEventListener(\"message\", receiveSecrets);\n\n const message = {\n [APIM_ASK_FOR_SECRETS_MESSAGE_KEY]: {\n instanceId,\n origin: self.location.origin,\n targetModule,\n },\n };\n\n if (targetModule === \"app\" && environment === \"development\") {\n self.parent.parent.postMessage(message, \"*\");\n } else {\n self.parent.postMessage(message, \"*\");\n }\n });\n\n return promise.finally(() => self.removeEventListener(\"message\", receiveSecrets));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Key for a search param, from which editor data will be loaded from.\n */\nexport const APIM_EDITOR_DATA_KEY = \"editorData\";\n/**\n * Key for a post message object, it's used to propagate changes from editor to the DevPortal. Used to prevent interference with other applications.\n */\nexport const APIM_ON_CHANGE_MESSAGE_KEY = \"customInputValueChangedMSAPIM\";\n/**\n * Key for a post message object, it's used to request and send secrets - token and user id, from the DevPortal. Used to prevent interference with other applications.\n */\nexport const APIM_ASK_FOR_SECRETS_MESSAGE_KEY = \"askForSecretsMSAPIM\";\n\nconst g: any = globalThis;\n\n/**\n * Base of a values obj\n */\nexport type ValuesCommon = Record<string, unknown>;\n/**\n * All possible runtime environments\n */\nexport type Environment = \"development\" | \"publishing\" | \"runtime\" | \"error\";\n\n/** Information about the widget instance received from the Dev Portal */\nexport interface PortalData {\n // /** web content's origin (URL) of your Dev Portal */\n // origin: string;\n /** current runtime environment */\n environment: Environment;\n /** ID of this particular instance of the widget */\n instanceId: string;\n}\n\n/** JSON object with all the data you'll receive from the Dev Portal */\nexport interface EditorData<Values extends ValuesCommon> extends PortalData {\n /** values you've set in the admin editor window */\n values: Partial<Values>;\n}\n\nfunction parseWidgetData<Values extends ValuesCommon>(\n urlSearchParams: URLSearchParams,\n): EditorData<Values> {\n try {\n const urlEditorParams: EditorData<Values> = JSON.parse(\n decodeURIComponent(urlSearchParams.get(APIM_EDITOR_DATA_KEY) ?? \"\"),\n );\n\n // if (!(\"origin\" in urlEditorParams)) {\n // console.error(\n // \"Could not get 'origin' from the search params of the URL:\\n\" + self.location.href\n // );\n // }\n return urlEditorParams;\n } catch (e) {\n console.error(\n `Could not get '${APIM_EDITOR_DATA_KEY}' from the search params of the URL:\\n` + g.location,\n e,\n );\n return { values: {}, environment: \"error\", instanceId: \"error\" };\n }\n}\n\nexport function getWidgetDataPure<Values extends ValuesCommon>(\n urlSearchParams: URLSearchParams,\n): EditorData<Values> {\n return parseWidgetData<Values>(urlSearchParams);\n}\n\n/**\n * Function to get all data related to the widget including technical values not expected to be needed in most cases.\n * Intended mostly for internal use, API might change. Consider using getValues or getEditorValues instead.\n */\nexport function getWidgetData<Values extends ValuesCommon>(): EditorData<Values> {\n return getWidgetDataPure(new URLSearchParams(g.location?.search ?? \"\"));\n}\n\nexport function getEditorValuesPure<Values extends ValuesCommon>(\n urlSearchParams: URLSearchParams,\n): Partial<Values> {\n return getWidgetDataPure<Values>(urlSearchParams).values;\n}\n\n/**\n * Function to get values you've set in the admin editor window.\n */\nexport function getEditorValues<Values extends ValuesCommon>(): Partial<Values> {\n return getEditorValuesPure<Values>(new URLSearchParams(g.location?.search ?? \"\"));\n}\n\nexport function getValuesPure<Values extends ValuesCommon>(\n valuesDefault: Values,\n urlSearchParams: URLSearchParams,\n): Values {\n const values = { ...valuesDefault }; // set Obj to contain all possible values and prefill default value\n const urlValues = parseWidgetData<Values>(urlSearchParams).values;\n\n Object.keys(values).forEach((key: keyof Values) => {\n const value = urlValues[key];\n if (value != null) values[key] = value as Values[typeof key]; // if value is specified in the URL, replace the default value\n });\n return values;\n}\n\n/**\n * Function to get values you've set in the admin editor window. Undefined/empty values are replaced with default values.\n *\n * @param valuesDefault - object with your default values to use, just import valuesDefault object from values.ts folder\n */\nexport function getValues<Values extends ValuesCommon>(valuesDefault: Values): Values {\n return getValuesPure(valuesDefault, new URLSearchParams(g.location?.search ?? \"\"));\n}\n\n/**\n * Type of the onChange function.\n */\nexport type OnChange<Values extends ValuesCommon> = (values: Partial<Values>) => void;\n\n/**\n * The onChange function itself with 'origin' provided as a param.\n *\n * @param origin - web content's origin (URL) of your Dev Portal to send changes to\n * @param instanceId - ID of this particular instance of the widget\n * @param values - values that changed\n */\nexport function onChangeWithOrigin<Values extends ValuesCommon>(\n origin: string,\n instanceId: string,\n values: Values,\n): void {\n Object.entries(values).forEach(([key, value]) => {\n g.parent?.postMessage?.({ [APIM_ON_CHANGE_MESSAGE_KEY]: { key, value, instanceId } }, origin);\n });\n}\n\n/**\n * Build onChange function, which you can use, to send changed data from the editor.\n */\nexport function buildOnChange<Values extends ValuesCommon>(): OnChange<Values> {\n const { instanceId } = getWidgetData();\n return (values: Partial<Values>) => onChangeWithOrigin(\"*\", instanceId, values);\n}\n\n/**\n * Possible target modules\n * \"app\" for main application which is embedded in your Dev Portal\n * \"editor\" for form in admin panel\n */\nexport type TargetModule = \"app\" | \"editor\";\n/**\n * Secrets needed for communication with Dev Portal back-end and other runtime data\n */\nexport type Secrets = {\n managementApiUrl: string;\n apiVersion: string;\n userId?: string;\n token?: string;\n parentLocation: {\n host: string;\n hostname: string;\n href: string;\n origin: string;\n pathname: string;\n port: string;\n protocol: string;\n search: string;\n };\n};\n\n/**\n * Request secrets - token & userId, from the Dev portal parent window.\n *\n * @param targetModule - is the function invoke from the main \"app\" window or the admin \"editor\"?\n */\nexport async function askForSecrets(targetModule: TargetModule): Promise<Secrets> {\n let receiveSecrets: (e: MessageEvent) => void;\n\n const promise = new Promise<Secrets>((resolve, reject) => {\n const { instanceId, environment }: PortalData = getWidgetData();\n\n receiveSecrets = ({ data }) => {\n if (!(APIM_ASK_FOR_SECRETS_MESSAGE_KEY in data)) return;\n\n const secrets = data[APIM_ASK_FOR_SECRETS_MESSAGE_KEY];\n if (typeof secrets !== \"object\" || !(\"managementApiUrl\" in secrets)) {\n reject(\"Secrets send by Dev Portal are invalid\");\n }\n\n resolve(secrets);\n };\n\n g.addEventListener?.(\"message\", receiveSecrets);\n\n const message = {\n [APIM_ASK_FOR_SECRETS_MESSAGE_KEY]: {\n instanceId,\n origin: g.location?.origin,\n targetModule,\n },\n };\n\n if (targetModule === \"app\" && environment === \"development\") {\n g.parent?.parent?.postMessage?.(message, \"*\");\n } else {\n g.parent?.postMessage?.(message, \"*\");\n }\n });\n\n return promise.finally(() => g.removeEventListener?.(\"message\", receiveSecrets));\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@azure/api-management-custom-widgets-tools",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.20250822.3",
|
|
4
4
|
"author": "Microsoft Corporation",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"sdk-type": "client",
|
|
@@ -26,32 +26,16 @@
|
|
|
26
26
|
"LICENSE",
|
|
27
27
|
"README.md"
|
|
28
28
|
],
|
|
29
|
-
"scripts": {
|
|
30
|
-
"build": "npm run clean && dev-tool run build-package && dev-tool run extract-api",
|
|
31
|
-
"build:samples": "echo skipped",
|
|
32
|
-
"check-format": "dev-tool run vendored prettier --list-different --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore --ignore-path ./.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"",
|
|
33
|
-
"clean": "dev-tool run vendored rimraf --glob dist dist-* types *.tgz *.log",
|
|
34
|
-
"extract-api": "tsc -p . && dev-tool run extract-api",
|
|
35
|
-
"format": "dev-tool run vendored prettier --write --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore --ignore-path ./.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"",
|
|
36
|
-
"lint": "eslint package.json src test",
|
|
37
|
-
"lint:fix": "eslint package.json src test --fix --fix-type [problem,suggestion]",
|
|
38
|
-
"pack": "npm pack 2>&1",
|
|
39
|
-
"test": "npm run test:node && npm run test:browser",
|
|
40
|
-
"test:browser": "dev-tool run build-test && dev-tool run test:vitest --no-test-proxy --browser",
|
|
41
|
-
"test:node": "dev-tool run test:vitest --no-test-proxy",
|
|
42
|
-
"test:node:esm": "dev-tool run test:vitest --esm --no-test-proxy",
|
|
43
|
-
"update-snippets": "dev-tool run update-snippets"
|
|
44
|
-
},
|
|
45
29
|
"devDependencies": {
|
|
46
|
-
"@
|
|
47
|
-
"@
|
|
48
|
-
"@
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
30
|
+
"@types/node": "^20.19.0",
|
|
31
|
+
"@vitest/browser": "^3.2.3",
|
|
32
|
+
"@vitest/coverage-istanbul": "^3.2.3",
|
|
33
|
+
"eslint": "^9.33.0",
|
|
34
|
+
"playwright": "^1.50.1",
|
|
35
|
+
"typescript": "~5.8.3",
|
|
36
|
+
"vitest": "^3.2.3",
|
|
37
|
+
"@azure/dev-tool": "^1.0.0",
|
|
38
|
+
"@azure/eslint-plugin-azure-sdk": "^3.0.0"
|
|
55
39
|
},
|
|
56
40
|
"dependencies": {
|
|
57
41
|
"@azure-rest/core-client": "^1.3.1",
|
|
@@ -94,5 +78,20 @@
|
|
|
94
78
|
},
|
|
95
79
|
"main": "./dist/commonjs/index.js",
|
|
96
80
|
"types": "./dist/commonjs/index.d.ts",
|
|
97
|
-
"module": "./dist/esm/index.js"
|
|
98
|
-
|
|
81
|
+
"module": "./dist/esm/index.js",
|
|
82
|
+
"scripts": {
|
|
83
|
+
"build": "npm run clean && dev-tool run build-package && dev-tool run extract-api",
|
|
84
|
+
"build:samples": "echo Skipped.",
|
|
85
|
+
"check-format": "dev-tool run vendored prettier --list-different --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore --ignore-path ./.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"",
|
|
86
|
+
"clean": "dev-tool run vendored rimraf --glob dist dist-* types *.tgz *.log",
|
|
87
|
+
"extract-api": "tsc -p . && dev-tool run extract-api",
|
|
88
|
+
"format": "dev-tool run vendored prettier --write --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore --ignore-path ./.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"",
|
|
89
|
+
"lint": "eslint package.json src test",
|
|
90
|
+
"lint:fix": "eslint package.json src test --fix --fix-type [problem,suggestion]",
|
|
91
|
+
"pack": "pnpm pack 2>&1",
|
|
92
|
+
"test": "npm run test:node && npm run test:browser",
|
|
93
|
+
"test:browser": "dev-tool run build-test && dev-tool run test:vitest --no-test-proxy --browser",
|
|
94
|
+
"test:node": "dev-tool run build-test --no-browser-test && dev-tool run test:vitest --no-test-proxy",
|
|
95
|
+
"update-snippets": "dev-tool run update-snippets"
|
|
96
|
+
}
|
|
97
|
+
}
|