@crimson-education/replit-sdk 1.0.1-alpha-14 → 1.0.2-beta-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/Readme.md +45 -3
- package/lib/hooks/use-url-params.d.ts +0 -1
- package/lib/hooks/use-url-params.d.ts.map +1 -1
- package/lib/hooks/use-url-params.js +2 -3
- package/lib/hooks/use-url-params.js.map +1 -1
- package/lib/utils/datadog.d.ts +3 -1
- package/lib/utils/datadog.d.ts.map +1 -1
- package/lib/utils/datadog.js +9 -4
- package/lib/utils/datadog.js.map +1 -1
- package/lib/utils/event.d.ts +14 -0
- package/lib/utils/event.d.ts.map +1 -0
- package/lib/utils/event.js +32 -0
- package/lib/utils/event.js.map +1 -0
- package/package.json +1 -1
package/Readme.md
CHANGED
|
@@ -1,8 +1,46 @@
|
|
|
1
|
+
## Replit SDK for Crimson App
|
|
2
|
+
|
|
3
|
+
This SDK facilitates the rapid integration of Replit-hosted applications into the Crimson ecosystem.
|
|
4
|
+
|
|
5
|
+
### Core Principle
|
|
6
|
+
|
|
7
|
+
The integration functions by passing environment variables and user parameters via URL parameters to the Replit frontend. This data is stored in-memory and persists until the current session ends.
|
|
8
|
+
|
|
9
|
+
Project Structure
|
|
10
|
+
|
|
11
|
+
- api
|
|
12
|
+
|
|
13
|
+
(expressRouter.ts): Provides the bindApi function, used to bind /api/function routes to server.js for forwarding API request calls.
|
|
14
|
+
|
|
15
|
+
(graphqlProxy.ts): Defines the data structures and schemas used for forwarding GraphQL interface requests.
|
|
16
|
+
|
|
17
|
+
- components
|
|
18
|
+
|
|
19
|
+
(external-link.tsx): A specialized component designed to handle navigation to external URLs.
|
|
20
|
+
|
|
21
|
+
- hooks
|
|
22
|
+
|
|
23
|
+
(use-url-params.ts): The core hook for processing parameters passed via iframe. It extracts essential data such as Auth Tokens and Environment API endpoints.
|
|
24
|
+
|
|
25
|
+
- functions
|
|
26
|
+
|
|
27
|
+
(index.ts): Contains implementations for fundamental API calls, including: `fetchLoginUser`, `getMyStudents`
|
|
28
|
+
|
|
29
|
+
- utils
|
|
30
|
+
|
|
31
|
+
(datadog.ts): Manages the Datadog initialization instance and provides the trackEvent function for analytics.
|
|
32
|
+
|
|
33
|
+
(event.ts): Utilities for iframe-to-parent communication using the postMessage API.
|
|
34
|
+
|
|
35
|
+
(queryClient.ts): A pre-configured API request client wrapper.
|
|
36
|
+
|
|
37
|
+
### Here is a set of prompts that you may need
|
|
38
|
+
|
|
1
39
|
Prompts from replit:
|
|
2
40
|
|
|
3
41
|
````
|
|
4
42
|
we are going to embed the app on a iframe, so now you need to do all things one by one listed here:
|
|
5
|
-
1. install and save package @crimson-education/replit-sdk@
|
|
43
|
+
1. install and save package @crimson-education/replit-sdk@1.0.2-beta
|
|
6
44
|
2. call `useUrlParams` on the Root app component, like ```function App() {
|
|
7
45
|
useUrlParams();
|
|
8
46
|
return (
|
|
@@ -14,9 +52,13 @@ we are going to embed the app on a iframe, so now you need to do all things one
|
|
|
14
52
|
</QueryClientProvider>
|
|
15
53
|
);
|
|
16
54
|
}```
|
|
17
|
-
3. set Express proxy endpint,
|
|
55
|
+
3. set Express proxy endpint, call `bindApi(app)` to bind `/api/function` route in `server/routes.ts`
|
|
18
56
|
4. use the ExternalLink component to replace all the <a> tag which has a external link.
|
|
19
|
-
5. set dev capp endpoint
|
|
57
|
+
5. set dev capp endpoint on top of the app before any api call like ```
|
|
20
58
|
import { setStoredParams } from "@crimson-education/replit-sdk/lib/hooks/use-url-params";
|
|
21
59
|
setStoredParams({'cappEndpoint': 'http://6d94f1eb.r8.cpolar.top/graphql'});```
|
|
60
|
+
6. remove fetch button and staff userId input in every student picker dialog, and set getStoredUserId() as default staffId to load students once the dialog opened.
|
|
61
|
+
7. replace the fetchLoginUser and fetchMyStudent function, use the exported functions from the sdk and clean up the redundant server-side endpoints.
|
|
62
|
+
8. the fetchStudents api could return duplicated students, remove them to keep unique
|
|
63
|
+
9.
|
|
22
64
|
````
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
export declare function useUrlParams(): void;
|
|
2
2
|
export declare function getStoredParam(key: string): string | null;
|
|
3
3
|
export declare function setStoredParam(key: string, value: string): void;
|
|
4
|
-
export declare const isBrowser: boolean;
|
|
5
4
|
export declare const isTopWindow: boolean;
|
|
6
5
|
export declare function setStoredParams(values: Record<string, string>, force?: boolean): void;
|
|
7
6
|
export declare function getStoredToken(): string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-url-params.d.ts","sourceRoot":"","sources":["../../src/hooks/use-url-params.ts"],"names":[],"mappings":"AAyEA,wBAAgB,YAAY,SAmB3B;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEzD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE/D;AAED,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"use-url-params.d.ts","sourceRoot":"","sources":["../../src/hooks/use-url-params.ts"],"names":[],"mappings":"AAyEA,wBAAgB,YAAY,SAmB3B;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEzD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE/D;AAED,eAAO,MAAM,WAAW,SAA8D,CAAC;AAEvF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAMrF;AAED,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isTopWindow =
|
|
3
|
+
exports.isTopWindow = void 0;
|
|
4
4
|
exports.useUrlParams = useUrlParams;
|
|
5
5
|
exports.getStoredParam = getStoredParam;
|
|
6
6
|
exports.setStoredParam = setStoredParam;
|
|
@@ -100,8 +100,7 @@ function getStoredParam(key) {
|
|
|
100
100
|
function setStoredParam(key, value) {
|
|
101
101
|
setParam(key, value);
|
|
102
102
|
}
|
|
103
|
-
exports.
|
|
104
|
-
exports.isTopWindow = exports.isBrowser ? window.self === window.top : false;
|
|
103
|
+
exports.isTopWindow = typeof window !== 'undefined' && window.self === window.top;
|
|
105
104
|
function setStoredParams(values, force) {
|
|
106
105
|
if (force || exports.isTopWindow) {
|
|
107
106
|
Object.entries(values).forEach(([key, value]) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-url-params.js","sourceRoot":"","sources":["../../src/hooks/use-url-params.ts"],"names":[],"mappings":";;;AAyEA,oCAmBC;AAED,wCAEC;AAED,wCAEC;
|
|
1
|
+
{"version":3,"file":"use-url-params.js","sourceRoot":"","sources":["../../src/hooks/use-url-params.ts"],"names":[],"mappings":"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"}
|
package/lib/utils/datadog.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { IOptions } from './event';
|
|
2
|
+
export declare const init: (options: IOptions) => void;
|
|
2
3
|
export declare const instance: null;
|
|
4
|
+
export declare const trackEvent: (metadata: any) => void;
|
|
3
5
|
//# sourceMappingURL=datadog.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datadog.d.ts","sourceRoot":"","sources":["../../src/utils/datadog.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,GAAI,
|
|
1
|
+
{"version":3,"file":"datadog.d.ts","sourceRoot":"","sources":["../../src/utils/datadog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,QAAQ,EAAqB,MAAM,SAAS,CAAC;AAEjE,eAAO,MAAM,IAAI,GAAI,SAAS,QAAQ,SAErC,CAAC;AAGF,eAAO,MAAM,QAAQ,MAAO,CAAC;AAE7B,eAAO,MAAM,UAAU,GAAI,UAAU,GAAG,SAEvC,CAAC"}
|
package/lib/utils/datadog.js
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.instance = exports.init = void 0;
|
|
4
|
-
const
|
|
5
|
-
|
|
3
|
+
exports.trackEvent = exports.instance = exports.init = void 0;
|
|
4
|
+
const event_1 = require("./event");
|
|
5
|
+
const init = (options) => {
|
|
6
|
+
(0, event_1.init)(options);
|
|
6
7
|
};
|
|
7
8
|
exports.init = init;
|
|
8
|
-
// TODO:
|
|
9
|
+
// TODO: return datadog instance
|
|
9
10
|
exports.instance = null;
|
|
11
|
+
const trackEvent = (metadata) => {
|
|
12
|
+
postMessage(event_1.EVENT_KEY.TRACK_EVENT, metadata);
|
|
13
|
+
};
|
|
14
|
+
exports.trackEvent = trackEvent;
|
|
10
15
|
//# sourceMappingURL=datadog.js.map
|
package/lib/utils/datadog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datadog.js","sourceRoot":"","sources":["../../src/utils/datadog.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"datadog.js","sourceRoot":"","sources":["../../src/utils/datadog.ts"],"names":[],"mappings":";;;AAAA,mCAAiE;AAE1D,MAAM,IAAI,GAAG,CAAC,OAAiB,EAAE,EAAE;IACxC,IAAA,YAAS,EAAC,OAAO,CAAC,CAAC;AACrB,CAAC,CAAC;AAFW,QAAA,IAAI,QAEf;AAEF,gCAAgC;AACnB,QAAA,QAAQ,GAAG,IAAI,CAAC;AAEtB,MAAM,UAAU,GAAG,CAAC,QAAa,EAAE,EAAE;IAC1C,WAAW,CAAC,iBAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC,CAAC;AAFW,QAAA,UAAU,cAErB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface IOptions {
|
|
2
|
+
app: string;
|
|
3
|
+
env?: string;
|
|
4
|
+
meta?: Record<string, any>;
|
|
5
|
+
[key: string]: any;
|
|
6
|
+
}
|
|
7
|
+
export declare const init: (options: IOptions) => void;
|
|
8
|
+
export declare enum EVENT_KEY {
|
|
9
|
+
OPEN_COPILOT = "OPEN_COPILOT",
|
|
10
|
+
TRACK_EVENT = "TRACK_EVENT",
|
|
11
|
+
CUSTOM_EVENT = "CUSTOM_EVENT"
|
|
12
|
+
}
|
|
13
|
+
export declare const postMessage: (event: string, metadata?: any, source?: string) => void;
|
|
14
|
+
//# sourceMappingURL=event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../src/utils/event.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAID,eAAO,MAAM,IAAI,GAAI,SAAS,QAAQ,SAIrC,CAAC;AAEF,oBAAY,SAAS;IACnB,YAAY,iBAAiB;IAC7B,WAAW,gBAAgB;IAC3B,YAAY,iBAAiB;CAC9B;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,EAAE,WAAW,GAAG,EAAE,SAAS,MAAM,SAazE,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.postMessage = exports.EVENT_KEY = exports.init = void 0;
|
|
4
|
+
const use_url_params_1 = require("../hooks/use-url-params");
|
|
5
|
+
const _options = { app: 'Untitled' };
|
|
6
|
+
const init = (options) => {
|
|
7
|
+
Object.keys(options).forEach((key) => {
|
|
8
|
+
_options[key] = options[key];
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
exports.init = init;
|
|
12
|
+
var EVENT_KEY;
|
|
13
|
+
(function (EVENT_KEY) {
|
|
14
|
+
EVENT_KEY["OPEN_COPILOT"] = "OPEN_COPILOT";
|
|
15
|
+
EVENT_KEY["TRACK_EVENT"] = "TRACK_EVENT";
|
|
16
|
+
EVENT_KEY["CUSTOM_EVENT"] = "CUSTOM_EVENT";
|
|
17
|
+
})(EVENT_KEY || (exports.EVENT_KEY = EVENT_KEY = {}));
|
|
18
|
+
const postMessage = (event, metadata, source) => {
|
|
19
|
+
// not in iframe
|
|
20
|
+
if (use_url_params_1.isTopWindow)
|
|
21
|
+
return;
|
|
22
|
+
if (typeof window === 'undefined')
|
|
23
|
+
return;
|
|
24
|
+
window.parent.postMessage({
|
|
25
|
+
from: source || _options.app || 'Untitled',
|
|
26
|
+
event,
|
|
27
|
+
type: 'REPLIT_IFRAME_SIGNAL',
|
|
28
|
+
data: { userId: (0, use_url_params_1.getStoredUserId)(), env: (0, use_url_params_1.getStoredEnv)(), ...metadata },
|
|
29
|
+
}, '*');
|
|
30
|
+
};
|
|
31
|
+
exports.postMessage = postMessage;
|
|
32
|
+
//# sourceMappingURL=event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.js","sourceRoot":"","sources":["../../src/utils/event.ts"],"names":[],"mappings":";;;AAAA,4DAAqF;AASrF,MAAM,QAAQ,GAAa,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;AAExC,MAAM,IAAI,GAAG,CAAC,OAAiB,EAAE,EAAE;IACxC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACnC,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAJW,QAAA,IAAI,QAIf;AAEF,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,0CAA6B,CAAA;IAC7B,wCAA2B,CAAA;IAC3B,0CAA6B,CAAA;AAC/B,CAAC,EAJW,SAAS,yBAAT,SAAS,QAIpB;AAEM,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,QAAc,EAAE,MAAe,EAAE,EAAE;IAC5E,gBAAgB;IAChB,IAAI,4BAAW;QAAE,OAAO;IACxB,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO;IAC1C,MAAM,CAAC,MAAM,CAAC,WAAW,CACvB;QACE,IAAI,EAAE,MAAM,IAAI,QAAQ,CAAC,GAAG,IAAI,UAAU;QAC1C,KAAK;QACL,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,EAAE,MAAM,EAAE,IAAA,gCAAe,GAAE,EAAE,GAAG,EAAE,IAAA,6BAAY,GAAE,EAAE,GAAG,QAAQ,EAAE;KACtE,EACD,GAAG,CACJ,CAAC;AACJ,CAAC,CAAC;AAbW,QAAA,WAAW,eAatB"}
|