@webiny/project 0.0.0-unstable.6f45466a1d → 0.0.0-unstable.df7a8bb475
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/components/Wcp.d.ts +17 -0
- package/components/Wcp.js +41 -0
- package/components/Wcp.js.map +1 -0
- package/index.d.ts +2 -0
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/package.json +13 -13
- package/services/GetProjectConfigService/WcpProjectLicenseContext.d.ts +13 -0
- package/services/GetProjectConfigService/WcpProjectLicenseContext.js +41 -0
- package/services/GetProjectConfigService/WcpProjectLicenseContext.js.map +1 -0
- package/services/GetProjectConfigService/renderConfigWorker.js +3 -2
- package/services/GetProjectConfigService/renderConfigWorker.js.map +1 -1
- package/services/InstallExtensionService/InstallExtensionService.js +21 -7
- package/services/InstallExtensionService/InstallExtensionService.js.map +1 -1
- package/services/InstallExtensionService/updateWebinyConfig.js +46 -1
- package/services/InstallExtensionService/updateWebinyConfig.js.map +1 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
interface ChildrenProps {
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
}
|
|
5
|
+
declare function CanUseMultiTenancy({ children }: ChildrenProps): React.JSX.Element | null;
|
|
6
|
+
declare function CanUseTeams({ children }: ChildrenProps): React.JSX.Element | null;
|
|
7
|
+
declare function CanUsePrivateFiles({ children }: ChildrenProps): React.JSX.Element | null;
|
|
8
|
+
declare function CanUseFileManagerThreatDetection({ children }: ChildrenProps): React.JSX.Element | null;
|
|
9
|
+
declare function CanUseWorkflows({ children }: ChildrenProps): React.JSX.Element | null;
|
|
10
|
+
export declare const Wcp: {
|
|
11
|
+
CanUseMultiTenancy: typeof CanUseMultiTenancy;
|
|
12
|
+
CanUseTeams: typeof CanUseTeams;
|
|
13
|
+
CanUsePrivateFiles: typeof CanUsePrivateFiles;
|
|
14
|
+
CanUseFileManagerThreatDetection: typeof CanUseFileManagerThreatDetection;
|
|
15
|
+
CanUseWorkflows: typeof CanUseWorkflows;
|
|
16
|
+
};
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { useWcpProjectLicense } from "../services/GetProjectConfigService/WcpProjectLicenseContext.js";
|
|
3
|
+
function CanUseMultiTenancy({
|
|
4
|
+
children
|
|
5
|
+
}) {
|
|
6
|
+
const wcp = useWcpProjectLicense();
|
|
7
|
+
return wcp.canUseMultiTenancy() ? /*#__PURE__*/React.createElement(React.Fragment, null, children) : null;
|
|
8
|
+
}
|
|
9
|
+
function CanUseTeams({
|
|
10
|
+
children
|
|
11
|
+
}) {
|
|
12
|
+
const wcp = useWcpProjectLicense();
|
|
13
|
+
return wcp.canUseTeams() ? /*#__PURE__*/React.createElement(React.Fragment, null, children) : null;
|
|
14
|
+
}
|
|
15
|
+
function CanUsePrivateFiles({
|
|
16
|
+
children
|
|
17
|
+
}) {
|
|
18
|
+
const wcp = useWcpProjectLicense();
|
|
19
|
+
return wcp.canUsePrivateFiles() ? /*#__PURE__*/React.createElement(React.Fragment, null, children) : null;
|
|
20
|
+
}
|
|
21
|
+
function CanUseFileManagerThreatDetection({
|
|
22
|
+
children
|
|
23
|
+
}) {
|
|
24
|
+
const wcp = useWcpProjectLicense();
|
|
25
|
+
return wcp.canUseFileManagerThreatDetection() ? /*#__PURE__*/React.createElement(React.Fragment, null, children) : null;
|
|
26
|
+
}
|
|
27
|
+
function CanUseWorkflows({
|
|
28
|
+
children
|
|
29
|
+
}) {
|
|
30
|
+
const wcp = useWcpProjectLicense();
|
|
31
|
+
return wcp.canUseWorkflows() ? /*#__PURE__*/React.createElement(React.Fragment, null, children) : null;
|
|
32
|
+
}
|
|
33
|
+
export const Wcp = {
|
|
34
|
+
CanUseMultiTenancy,
|
|
35
|
+
CanUseTeams,
|
|
36
|
+
CanUsePrivateFiles,
|
|
37
|
+
CanUseFileManagerThreatDetection,
|
|
38
|
+
CanUseWorkflows
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=Wcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","useWcpProjectLicense","CanUseMultiTenancy","children","wcp","canUseMultiTenancy","createElement","Fragment","CanUseTeams","canUseTeams","CanUsePrivateFiles","canUsePrivateFiles","CanUseFileManagerThreatDetection","canUseFileManagerThreatDetection","CanUseWorkflows","canUseWorkflows","Wcp"],"sources":["Wcp.tsx"],"sourcesContent":["import React from \"react\";\nimport { useWcpProjectLicense } from \"~/services/GetProjectConfigService/WcpProjectLicenseContext.js\";\n\ninterface ChildrenProps {\n children: React.ReactNode;\n}\n\nfunction CanUseMultiTenancy({ children }: ChildrenProps) {\n const wcp = useWcpProjectLicense();\n\n return wcp.canUseMultiTenancy() ? <>{children}</> : null;\n}\n\nfunction CanUseTeams({ children }: ChildrenProps) {\n const wcp = useWcpProjectLicense();\n\n return wcp.canUseTeams() ? <>{children}</> : null;\n}\n\nfunction CanUsePrivateFiles({ children }: ChildrenProps) {\n const wcp = useWcpProjectLicense();\n\n return wcp.canUsePrivateFiles() ? <>{children}</> : null;\n}\n\nfunction CanUseFileManagerThreatDetection({ children }: ChildrenProps) {\n const wcp = useWcpProjectLicense();\n\n return wcp.canUseFileManagerThreatDetection() ? <>{children}</> : null;\n}\n\nfunction CanUseWorkflows({ children }: ChildrenProps) {\n const wcp = useWcpProjectLicense();\n\n return wcp.canUseWorkflows() ? <>{children}</> : null;\n}\n\nexport const Wcp = {\n CanUseMultiTenancy,\n CanUseTeams,\n CanUsePrivateFiles,\n CanUseFileManagerThreatDetection,\n CanUseWorkflows\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,oBAAoB;AAM7B,SAASC,kBAAkBA,CAAC;EAAEC;AAAwB,CAAC,EAAE;EACrD,MAAMC,GAAG,GAAGH,oBAAoB,CAAC,CAAC;EAElC,OAAOG,GAAG,CAACC,kBAAkB,CAAC,CAAC,gBAAGL,KAAA,CAAAM,aAAA,CAAAN,KAAA,CAAAO,QAAA,QAAGJ,QAAW,CAAC,GAAG,IAAI;AAC5D;AAEA,SAASK,WAAWA,CAAC;EAAEL;AAAwB,CAAC,EAAE;EAC9C,MAAMC,GAAG,GAAGH,oBAAoB,CAAC,CAAC;EAElC,OAAOG,GAAG,CAACK,WAAW,CAAC,CAAC,gBAAGT,KAAA,CAAAM,aAAA,CAAAN,KAAA,CAAAO,QAAA,QAAGJ,QAAW,CAAC,GAAG,IAAI;AACrD;AAEA,SAASO,kBAAkBA,CAAC;EAAEP;AAAwB,CAAC,EAAE;EACrD,MAAMC,GAAG,GAAGH,oBAAoB,CAAC,CAAC;EAElC,OAAOG,GAAG,CAACO,kBAAkB,CAAC,CAAC,gBAAGX,KAAA,CAAAM,aAAA,CAAAN,KAAA,CAAAO,QAAA,QAAGJ,QAAW,CAAC,GAAG,IAAI;AAC5D;AAEA,SAASS,gCAAgCA,CAAC;EAAET;AAAwB,CAAC,EAAE;EACnE,MAAMC,GAAG,GAAGH,oBAAoB,CAAC,CAAC;EAElC,OAAOG,GAAG,CAACS,gCAAgC,CAAC,CAAC,gBAAGb,KAAA,CAAAM,aAAA,CAAAN,KAAA,CAAAO,QAAA,QAAGJ,QAAW,CAAC,GAAG,IAAI;AAC1E;AAEA,SAASW,eAAeA,CAAC;EAAEX;AAAwB,CAAC,EAAE;EAClD,MAAMC,GAAG,GAAGH,oBAAoB,CAAC,CAAC;EAElC,OAAOG,GAAG,CAACW,eAAe,CAAC,CAAC,gBAAGf,KAAA,CAAAM,aAAA,CAAAN,KAAA,CAAAO,QAAA,QAAGJ,QAAW,CAAC,GAAG,IAAI;AACzD;AAEA,OAAO,MAAMa,GAAG,GAAG;EACfd,kBAAkB;EAClBM,WAAW;EACXE,kBAAkB;EAClBE,gCAAgC;EAChCE;AACJ,CAAC","ignoreList":[]}
|
package/index.d.ts
CHANGED
|
@@ -10,3 +10,5 @@ export type { IStackOutput } from "./abstractions/features/GetAppStackOutput.js"
|
|
|
10
10
|
export { PackageJson } from "@webiny/build-tools/utils/PackageJson.js";
|
|
11
11
|
export { createPathResolver } from "./utils/createPathResolver.js";
|
|
12
12
|
export { GracefulError } from "./GracefulError.js";
|
|
13
|
+
export { Wcp } from "./components/Wcp.js";
|
|
14
|
+
export { WcpProjectLicenseProvider, useWcpProjectLicense } from "./services/GetProjectConfigService/WcpProjectLicenseContext.js";
|
package/index.js
CHANGED
|
@@ -13,5 +13,7 @@ export { ProjectSdk };
|
|
|
13
13
|
export { PackageJson } from "@webiny/build-tools/utils/PackageJson.js";
|
|
14
14
|
export { createPathResolver } from "./utils/createPathResolver.js";
|
|
15
15
|
export { GracefulError } from "./GracefulError.js";
|
|
16
|
+
export { Wcp } from "./components/Wcp.js";
|
|
17
|
+
export { WcpProjectLicenseProvider, useWcpProjectLicense } from "./services/GetProjectConfigService/WcpProjectLicenseContext.js";
|
|
16
18
|
|
|
17
19
|
//# sourceMappingURL=index.js.map
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ProjectSdk","getProjectSdk","params","init","getStackOutput","appName","sdk","getAppStackOutput","PackageJson","createPathResolver","GracefulError"],"sources":["index.ts"],"sourcesContent":["import { ProjectSdk } from \"./ProjectSdk.js\";\nimport { type GetAppStackOutput } from \"~/abstractions/index.js\";\nimport { type AppName } from \"~/abstractions/types.js\";\n\nexport const getProjectSdk = (...params: Parameters<(typeof ProjectSdk)[\"init\"]>) => {\n return ProjectSdk.init(...params);\n};\n\n// A temporary convenience function to get the stack output for a specific app. We might revisit this in the\n// future and double check if there's a better way to expose this functionality.\nexport const getStackOutput = async <\n TOutput extends GetAppStackOutput.StackOutput = GetAppStackOutput.StackOutput\n>(\n appName: AppName\n) => {\n const sdk = await getProjectSdk();\n return sdk.getAppStackOutput<TOutput>(appName);\n};\n\nexport { ProjectSdk };\n\nexport type { AppName } from \"./abstractions/types.js\";\nexport type * from \"./abstractions/models/index.js\";\n\nexport type { IStackOutput } from \"~/abstractions/features/GetAppStackOutput.js\";\n\nexport { PackageJson } from \"@webiny/build-tools/utils/PackageJson.js\";\n\nexport { createPathResolver } from \"./utils/createPathResolver.js\";\n\nexport { GracefulError } from \"./GracefulError.js\";\n"],"mappings":"AAAA,SAASA,UAAU;AAInB,OAAO,MAAMC,aAAa,GAAGA,CAAC,GAAGC,MAA+C,KAAK;EACjF,OAAOF,UAAU,CAACG,IAAI,CAAC,GAAGD,MAAM,CAAC;AACrC,CAAC;;AAED;AACA;AACA,OAAO,MAAME,cAAc,GAAG,MAG1BC,OAAgB,IACf;EACD,MAAMC,GAAG,GAAG,MAAML,aAAa,CAAC,CAAC;EACjC,OAAOK,GAAG,CAACC,iBAAiB,CAAUF,OAAO,CAAC;AAClD,CAAC;AAED,SAASL,UAAU;AAOnB,SAASQ,WAAW,QAAQ,0CAA0C;AAEtE,SAASC,kBAAkB;AAE3B,SAASC,aAAa","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["ProjectSdk","getProjectSdk","params","init","getStackOutput","appName","sdk","getAppStackOutput","PackageJson","createPathResolver","GracefulError","Wcp","WcpProjectLicenseProvider","useWcpProjectLicense"],"sources":["index.ts"],"sourcesContent":["import { ProjectSdk } from \"./ProjectSdk.js\";\nimport { type GetAppStackOutput } from \"~/abstractions/index.js\";\nimport { type AppName } from \"~/abstractions/types.js\";\n\nexport const getProjectSdk = (...params: Parameters<(typeof ProjectSdk)[\"init\"]>) => {\n return ProjectSdk.init(...params);\n};\n\n// A temporary convenience function to get the stack output for a specific app. We might revisit this in the\n// future and double check if there's a better way to expose this functionality.\nexport const getStackOutput = async <\n TOutput extends GetAppStackOutput.StackOutput = GetAppStackOutput.StackOutput\n>(\n appName: AppName\n) => {\n const sdk = await getProjectSdk();\n return sdk.getAppStackOutput<TOutput>(appName);\n};\n\nexport { ProjectSdk };\n\nexport type { AppName } from \"./abstractions/types.js\";\nexport type * from \"./abstractions/models/index.js\";\n\nexport type { IStackOutput } from \"~/abstractions/features/GetAppStackOutput.js\";\n\nexport { PackageJson } from \"@webiny/build-tools/utils/PackageJson.js\";\n\nexport { createPathResolver } from \"./utils/createPathResolver.js\";\n\nexport { GracefulError } from \"./GracefulError.js\";\n\nexport { Wcp } from \"./components/Wcp.js\";\nexport {\n WcpProjectLicenseProvider,\n useWcpProjectLicense\n} from \"./services/GetProjectConfigService/WcpProjectLicenseContext.js\";\n"],"mappings":"AAAA,SAASA,UAAU;AAInB,OAAO,MAAMC,aAAa,GAAGA,CAAC,GAAGC,MAA+C,KAAK;EACjF,OAAOF,UAAU,CAACG,IAAI,CAAC,GAAGD,MAAM,CAAC;AACrC,CAAC;;AAED;AACA;AACA,OAAO,MAAME,cAAc,GAAG,MAG1BC,OAAgB,IACf;EACD,MAAMC,GAAG,GAAG,MAAML,aAAa,CAAC,CAAC;EACjC,OAAOK,GAAG,CAACC,iBAAiB,CAAUF,OAAO,CAAC;AAClD,CAAC;AAED,SAASL,UAAU;AAOnB,SAASQ,WAAW,QAAQ,0CAA0C;AAEtE,SAASC,kBAAkB;AAE3B,SAASC,aAAa;AAEtB,SAASC,GAAG;AACZ,SACIC,yBAAyB,EACzBC,oBAAoB","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/project",
|
|
3
|
-
"version": "0.0.0-unstable.
|
|
3
|
+
"version": "0.0.0-unstable.df7a8bb475",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"repository": {
|
|
@@ -10,22 +10,22 @@
|
|
|
10
10
|
"description": "An SDK for managing Webiny projects.",
|
|
11
11
|
"license": "MIT",
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@webiny/aws-sdk": "0.0.0-unstable.
|
|
14
|
-
"@webiny/build-tools": "0.0.0-unstable.
|
|
13
|
+
"@webiny/aws-sdk": "0.0.0-unstable.df7a8bb475",
|
|
14
|
+
"@webiny/build-tools": "0.0.0-unstable.df7a8bb475",
|
|
15
15
|
"@webiny/di": "0.2.3",
|
|
16
|
-
"@webiny/global-config": "0.0.0-unstable.
|
|
17
|
-
"@webiny/pulumi-sdk": "0.0.0-unstable.
|
|
18
|
-
"@webiny/react-properties": "0.0.0-unstable.
|
|
19
|
-
"@webiny/system-requirements": "0.0.0-unstable.
|
|
20
|
-
"@webiny/telemetry": "0.0.0-unstable.
|
|
21
|
-
"@webiny/utils": "0.0.0-unstable.
|
|
22
|
-
"@webiny/wcp": "0.0.0-unstable.
|
|
16
|
+
"@webiny/global-config": "0.0.0-unstable.df7a8bb475",
|
|
17
|
+
"@webiny/pulumi-sdk": "0.0.0-unstable.df7a8bb475",
|
|
18
|
+
"@webiny/react-properties": "0.0.0-unstable.df7a8bb475",
|
|
19
|
+
"@webiny/system-requirements": "0.0.0-unstable.df7a8bb475",
|
|
20
|
+
"@webiny/telemetry": "0.0.0-unstable.df7a8bb475",
|
|
21
|
+
"@webiny/utils": "0.0.0-unstable.df7a8bb475",
|
|
22
|
+
"@webiny/wcp": "0.0.0-unstable.df7a8bb475",
|
|
23
23
|
"chalk": "4.1.2",
|
|
24
24
|
"chokidar": "4.0.3",
|
|
25
25
|
"ci-info": "4.4.0",
|
|
26
26
|
"debounce": "1.2.1",
|
|
27
27
|
"deepmerge": "4.3.1",
|
|
28
|
-
"dotenv": "17.
|
|
28
|
+
"dotenv": "17.3.1",
|
|
29
29
|
"execa": "5.1.1",
|
|
30
30
|
"exit-hook": "4.0.0",
|
|
31
31
|
"fast-glob": "3.3.3",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"@types/lodash": "4.17.23",
|
|
58
58
|
"@types/react-test-renderer": "18.3.1",
|
|
59
59
|
"@types/read-json-sync": "2.0.3",
|
|
60
|
-
"rimraf": "6.1.
|
|
60
|
+
"rimraf": "6.1.3",
|
|
61
61
|
"type-fest": "5.4.4",
|
|
62
62
|
"typescript": "5.9.3"
|
|
63
63
|
},
|
|
@@ -75,5 +75,5 @@
|
|
|
75
75
|
"access": "public",
|
|
76
76
|
"directory": "dist"
|
|
77
77
|
},
|
|
78
|
-
"gitHead": "
|
|
78
|
+
"gitHead": "df7a8bb4755a1da047f0af8c56bdb649cc81bf7d"
|
|
79
79
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface WcpProjectLicenseContextValue {
|
|
3
|
+
hasLicense: boolean;
|
|
4
|
+
canUseMultiTenancy: () => boolean;
|
|
5
|
+
canUseTeams: () => boolean;
|
|
6
|
+
canUsePrivateFiles: () => boolean;
|
|
7
|
+
canUseFileManagerThreatDetection: () => boolean;
|
|
8
|
+
canUseWorkflows: () => boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare const WcpProjectLicenseProvider: React.FC<{
|
|
11
|
+
children: React.ReactNode;
|
|
12
|
+
}>;
|
|
13
|
+
export declare const useWcpProjectLicense: () => WcpProjectLicenseContextValue;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React, { createContext, useContext, useMemo } from "react";
|
|
2
|
+
import { License } from "@webiny/wcp";
|
|
3
|
+
const WcpProjectLicenseContext = /*#__PURE__*/createContext(null);
|
|
4
|
+
export const WcpProjectLicenseProvider = ({
|
|
5
|
+
children
|
|
6
|
+
}) => {
|
|
7
|
+
const license = useMemo(() => {
|
|
8
|
+
const licenseEnv = process.env.WCP_PROJECT_LICENSE;
|
|
9
|
+
if (!licenseEnv) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
const licenseDto = JSON.parse(licenseEnv);
|
|
14
|
+
return License.fromLicenseDto(licenseDto);
|
|
15
|
+
} catch (e) {
|
|
16
|
+
console.warn("Failed to parse WCP_PROJECT_LICENSE environment variable. Expected valid JSON with DecryptedWcpProjectLicense format:", e);
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}, []);
|
|
20
|
+
const hasLicense = !!license;
|
|
21
|
+
const value = {
|
|
22
|
+
hasLicense,
|
|
23
|
+
canUseMultiTenancy: () => hasLicense,
|
|
24
|
+
canUseTeams: () => license?.canUseTeams() ?? false,
|
|
25
|
+
canUsePrivateFiles: () => license?.canUsePrivateFiles() ?? false,
|
|
26
|
+
canUseFileManagerThreatDetection: () => license?.canUseFileManagerThreatDetection() ?? false,
|
|
27
|
+
canUseWorkflows: () => license?.canUseWorkflows() ?? false
|
|
28
|
+
};
|
|
29
|
+
return /*#__PURE__*/React.createElement(WcpProjectLicenseContext.Provider, {
|
|
30
|
+
value: value
|
|
31
|
+
}, children);
|
|
32
|
+
};
|
|
33
|
+
export const useWcpProjectLicense = () => {
|
|
34
|
+
const context = useContext(WcpProjectLicenseContext);
|
|
35
|
+
if (!context) {
|
|
36
|
+
throw new Error("useWcpProjectLicense must be used within a WcpProjectLicenseProvider");
|
|
37
|
+
}
|
|
38
|
+
return context;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=WcpProjectLicenseContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","createContext","useContext","useMemo","License","WcpProjectLicenseContext","WcpProjectLicenseProvider","children","license","licenseEnv","process","env","WCP_PROJECT_LICENSE","licenseDto","JSON","parse","fromLicenseDto","e","console","warn","hasLicense","value","canUseMultiTenancy","canUseTeams","canUsePrivateFiles","canUseFileManagerThreatDetection","canUseWorkflows","createElement","Provider","useWcpProjectLicense","context","Error"],"sources":["WcpProjectLicenseContext.tsx"],"sourcesContent":["import React, { createContext, useContext, useMemo } from \"react\";\nimport { License } from \"@webiny/wcp\";\nimport type { DecryptedWcpProjectLicense } from \"@webiny/wcp/types.js\";\n\nexport interface WcpProjectLicenseContextValue {\n hasLicense: boolean;\n canUseMultiTenancy: () => boolean;\n canUseTeams: () => boolean;\n canUsePrivateFiles: () => boolean;\n canUseFileManagerThreatDetection: () => boolean;\n canUseWorkflows: () => boolean;\n}\n\nconst WcpProjectLicenseContext = createContext<WcpProjectLicenseContextValue | null>(null);\n\nexport const WcpProjectLicenseProvider: React.FC<{ children: React.ReactNode }> = ({\n children\n}) => {\n const license = useMemo(() => {\n const licenseEnv = process.env.WCP_PROJECT_LICENSE;\n if (!licenseEnv) {\n return null;\n }\n\n try {\n const licenseDto = JSON.parse(licenseEnv) as DecryptedWcpProjectLicense;\n return License.fromLicenseDto(licenseDto);\n } catch (e) {\n console.warn(\n \"Failed to parse WCP_PROJECT_LICENSE environment variable. Expected valid JSON with DecryptedWcpProjectLicense format:\",\n e\n );\n return null;\n }\n }, []);\n\n const hasLicense = !!license;\n\n const value: WcpProjectLicenseContextValue = {\n hasLicense,\n canUseMultiTenancy: () => hasLicense,\n canUseTeams: () => license?.canUseTeams() ?? false,\n canUsePrivateFiles: () => license?.canUsePrivateFiles() ?? false,\n canUseFileManagerThreatDetection: () =>\n license?.canUseFileManagerThreatDetection() ?? false,\n canUseWorkflows: () => license?.canUseWorkflows() ?? false\n };\n\n return (\n <WcpProjectLicenseContext.Provider value={value}>\n {children}\n </WcpProjectLicenseContext.Provider>\n );\n};\n\nexport const useWcpProjectLicense = () => {\n const context = useContext(WcpProjectLicenseContext);\n if (!context) {\n throw new Error(\"useWcpProjectLicense must be used within a WcpProjectLicenseProvider\");\n }\n return context;\n};\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,aAAa,EAAEC,UAAU,EAAEC,OAAO,QAAQ,OAAO;AACjE,SAASC,OAAO,QAAQ,aAAa;AAYrC,MAAMC,wBAAwB,gBAAGJ,aAAa,CAAuC,IAAI,CAAC;AAE1F,OAAO,MAAMK,yBAAkE,GAAGA,CAAC;EAC/EC;AACJ,CAAC,KAAK;EACF,MAAMC,OAAO,GAAGL,OAAO,CAAC,MAAM;IAC1B,MAAMM,UAAU,GAAGC,OAAO,CAACC,GAAG,CAACC,mBAAmB;IAClD,IAAI,CAACH,UAAU,EAAE;MACb,OAAO,IAAI;IACf;IAEA,IAAI;MACA,MAAMI,UAAU,GAAGC,IAAI,CAACC,KAAK,CAACN,UAAU,CAA+B;MACvE,OAAOL,OAAO,CAACY,cAAc,CAACH,UAAU,CAAC;IAC7C,CAAC,CAAC,OAAOI,CAAC,EAAE;MACRC,OAAO,CAACC,IAAI,CACR,uHAAuH,EACvHF,CACJ,CAAC;MACD,OAAO,IAAI;IACf;EACJ,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMG,UAAU,GAAG,CAAC,CAACZ,OAAO;EAE5B,MAAMa,KAAoC,GAAG;IACzCD,UAAU;IACVE,kBAAkB,EAAEA,CAAA,KAAMF,UAAU;IACpCG,WAAW,EAAEA,CAAA,KAAMf,OAAO,EAAEe,WAAW,CAAC,CAAC,IAAI,KAAK;IAClDC,kBAAkB,EAAEA,CAAA,KAAMhB,OAAO,EAAEgB,kBAAkB,CAAC,CAAC,IAAI,KAAK;IAChEC,gCAAgC,EAAEA,CAAA,KAC9BjB,OAAO,EAAEiB,gCAAgC,CAAC,CAAC,IAAI,KAAK;IACxDC,eAAe,EAAEA,CAAA,KAAMlB,OAAO,EAAEkB,eAAe,CAAC,CAAC,IAAI;EACzD,CAAC;EAED,oBACI1B,KAAA,CAAA2B,aAAA,CAACtB,wBAAwB,CAACuB,QAAQ;IAACP,KAAK,EAAEA;EAAM,GAC3Cd,QAC8B,CAAC;AAE5C,CAAC;AAED,OAAO,MAAMsB,oBAAoB,GAAGA,CAAA,KAAM;EACtC,MAAMC,OAAO,GAAG5B,UAAU,CAACG,wBAAwB,CAAC;EACpD,IAAI,CAACyB,OAAO,EAAE;IACV,MAAM,IAAIC,KAAK,CAAC,sEAAsE,CAAC;EAC3F;EACA,OAAOD,OAAO;AAClB,CAAC","ignoreList":[]}
|
|
@@ -6,6 +6,7 @@ import Renderer from "react-test-renderer";
|
|
|
6
6
|
import { serializeError } from "serialize-error";
|
|
7
7
|
import { ProjectModel } from "../../models/ProjectModel.js";
|
|
8
8
|
import { EnvProvider } from "./EnvContext.js";
|
|
9
|
+
import { WcpProjectLicenseProvider } from "./WcpProjectLicenseContext.js";
|
|
9
10
|
const sendError = err => {
|
|
10
11
|
const message = {
|
|
11
12
|
type: "error",
|
|
@@ -50,8 +51,8 @@ const onChange = debounce(value => {
|
|
|
50
51
|
sendSuccess(toObject(value));
|
|
51
52
|
process.exit(0);
|
|
52
53
|
});
|
|
53
|
-
Renderer.create(/*#__PURE__*/React.createElement(EnvProvider, null, /*#__PURE__*/React.createElement(Properties, {
|
|
54
|
+
Renderer.create(/*#__PURE__*/React.createElement(WcpProjectLicenseProvider, null, /*#__PURE__*/React.createElement(EnvProvider, null, /*#__PURE__*/React.createElement(Properties, {
|
|
54
55
|
onChange: onChange
|
|
55
|
-
}, /*#__PURE__*/React.createElement(Extensions, null))));
|
|
56
|
+
}, /*#__PURE__*/React.createElement(Extensions, null)))));
|
|
56
57
|
|
|
57
58
|
//# sourceMappingURL=renderConfigWorker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Properties","toObject","debounce","React","Renderer","serializeError","ProjectModel","EnvProvider","sendError","err","message","type","error","data","process","send","console","sendSuccess","log","on","exit","reason","Error","String","project","projectModelDto","JSON","parse","argv","fromDto","Extensions","paths","webinyConfigBaseFile","toString","onChange","value","create","createElement"],"sources":["renderConfigWorker.tsx"],"sourcesContent":["import \"tsx/esm\";\nimport { Properties, toObject } from \"@webiny/react-properties\";\nimport debounce from \"debounce\";\nimport React from \"react\";\nimport Renderer from \"react-test-renderer\";\nimport { serializeError } from \"serialize-error\";\nimport type { RenderConfigWorkerMessageDto, RenderConfigParamsDto } from \"./renderConfig.js\";\nimport { ProjectModel } from \"~/models/ProjectModel.js\";\nimport { EnvProvider } from \"./EnvContext.js\";\n\nconst sendError = (err: Error) => {\n const message: RenderConfigWorkerMessageDto = {\n type: \"error\",\n error: serializeError(err),\n data: null\n };\n\n if (process.send) {\n process.send!(message);\n } else {\n console.error(message);\n }\n};\n\nconst sendSuccess = (data: Record<string, any> = {}) => {\n const message: RenderConfigWorkerMessageDto = {\n type: \"success\",\n error: null,\n data\n };\n\n if (process.send) {\n process.send!(message);\n } else {\n console.log(message);\n }\n};\n\nprocess.on(\"uncaughtException\", err => {\n sendError(err);\n process.exit(1);\n});\n\nprocess.on(\"unhandledRejection\", reason => {\n const err = reason instanceof Error ? reason : new Error(String(reason));\n sendError(err);\n process.exit(1);\n});\n\nconst { project: projectModelDto } = JSON.parse(process.argv[2]) as RenderConfigParamsDto;\nconst project = ProjectModel.fromDto(projectModelDto);\n\nconst { Extensions } = await import(project.paths.webinyConfigBaseFile.toString());\n\nconst onChange = debounce((value: any) => {\n sendSuccess(toObject(value));\n process.exit(0);\n});\n\nRenderer.create(\n <
|
|
1
|
+
{"version":3,"names":["Properties","toObject","debounce","React","Renderer","serializeError","ProjectModel","EnvProvider","WcpProjectLicenseProvider","sendError","err","message","type","error","data","process","send","console","sendSuccess","log","on","exit","reason","Error","String","project","projectModelDto","JSON","parse","argv","fromDto","Extensions","paths","webinyConfigBaseFile","toString","onChange","value","create","createElement"],"sources":["renderConfigWorker.tsx"],"sourcesContent":["import \"tsx/esm\";\nimport { Properties, toObject } from \"@webiny/react-properties\";\nimport debounce from \"debounce\";\nimport React from \"react\";\nimport Renderer from \"react-test-renderer\";\nimport { serializeError } from \"serialize-error\";\nimport type { RenderConfigWorkerMessageDto, RenderConfigParamsDto } from \"./renderConfig.js\";\nimport { ProjectModel } from \"~/models/ProjectModel.js\";\nimport { EnvProvider } from \"./EnvContext.js\";\nimport { WcpProjectLicenseProvider } from \"./WcpProjectLicenseContext.js\";\n\nconst sendError = (err: Error) => {\n const message: RenderConfigWorkerMessageDto = {\n type: \"error\",\n error: serializeError(err),\n data: null\n };\n\n if (process.send) {\n process.send!(message);\n } else {\n console.error(message);\n }\n};\n\nconst sendSuccess = (data: Record<string, any> = {}) => {\n const message: RenderConfigWorkerMessageDto = {\n type: \"success\",\n error: null,\n data\n };\n\n if (process.send) {\n process.send!(message);\n } else {\n console.log(message);\n }\n};\n\nprocess.on(\"uncaughtException\", err => {\n sendError(err);\n process.exit(1);\n});\n\nprocess.on(\"unhandledRejection\", reason => {\n const err = reason instanceof Error ? reason : new Error(String(reason));\n sendError(err);\n process.exit(1);\n});\n\nconst { project: projectModelDto } = JSON.parse(process.argv[2]) as RenderConfigParamsDto;\nconst project = ProjectModel.fromDto(projectModelDto);\n\nconst { Extensions } = await import(project.paths.webinyConfigBaseFile.toString());\n\nconst onChange = debounce((value: any) => {\n sendSuccess(toObject(value));\n process.exit(0);\n});\n\nRenderer.create(\n <WcpProjectLicenseProvider>\n <EnvProvider>\n <Properties onChange={onChange}>\n <Extensions />\n </Properties>\n </EnvProvider>\n </WcpProjectLicenseProvider>\n);\n"],"mappings":"AAAA,OAAO,SAAS;AAChB,SAASA,UAAU,EAAEC,QAAQ,QAAQ,0BAA0B;AAC/D,OAAOC,QAAQ,MAAM,UAAU;AAC/B,OAAOC,KAAK,MAAM,OAAO;AACzB,OAAOC,QAAQ,MAAM,qBAAqB;AAC1C,SAASC,cAAc,QAAQ,iBAAiB;AAEhD,SAASC,YAAY;AACrB,SAASC,WAAW;AACpB,SAASC,yBAAyB;AAElC,MAAMC,SAAS,GAAIC,GAAU,IAAK;EAC9B,MAAMC,OAAqC,GAAG;IAC1CC,IAAI,EAAE,OAAO;IACbC,KAAK,EAAER,cAAc,CAACK,GAAG,CAAC;IAC1BI,IAAI,EAAE;EACV,CAAC;EAED,IAAIC,OAAO,CAACC,IAAI,EAAE;IACdD,OAAO,CAACC,IAAI,CAAEL,OAAO,CAAC;EAC1B,CAAC,MAAM;IACHM,OAAO,CAACJ,KAAK,CAACF,OAAO,CAAC;EAC1B;AACJ,CAAC;AAED,MAAMO,WAAW,GAAGA,CAACJ,IAAyB,GAAG,CAAC,CAAC,KAAK;EACpD,MAAMH,OAAqC,GAAG;IAC1CC,IAAI,EAAE,SAAS;IACfC,KAAK,EAAE,IAAI;IACXC;EACJ,CAAC;EAED,IAAIC,OAAO,CAACC,IAAI,EAAE;IACdD,OAAO,CAACC,IAAI,CAAEL,OAAO,CAAC;EAC1B,CAAC,MAAM;IACHM,OAAO,CAACE,GAAG,CAACR,OAAO,CAAC;EACxB;AACJ,CAAC;AAEDI,OAAO,CAACK,EAAE,CAAC,mBAAmB,EAAEV,GAAG,IAAI;EACnCD,SAAS,CAACC,GAAG,CAAC;EACdK,OAAO,CAACM,IAAI,CAAC,CAAC,CAAC;AACnB,CAAC,CAAC;AAEFN,OAAO,CAACK,EAAE,CAAC,oBAAoB,EAAEE,MAAM,IAAI;EACvC,MAAMZ,GAAG,GAAGY,MAAM,YAAYC,KAAK,GAAGD,MAAM,GAAG,IAAIC,KAAK,CAACC,MAAM,CAACF,MAAM,CAAC,CAAC;EACxEb,SAAS,CAACC,GAAG,CAAC;EACdK,OAAO,CAACM,IAAI,CAAC,CAAC,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM;EAAEI,OAAO,EAAEC;AAAgB,CAAC,GAAGC,IAAI,CAACC,KAAK,CAACb,OAAO,CAACc,IAAI,CAAC,CAAC,CAAC,CAA0B;AACzF,MAAMJ,OAAO,GAAGnB,YAAY,CAACwB,OAAO,CAACJ,eAAe,CAAC;AAErD,MAAM;EAAEK;AAAW,CAAC,GAAG,MAAM,MAAM,CAACN,OAAO,CAACO,KAAK,CAACC,oBAAoB,CAACC,QAAQ,CAAC,CAAC,CAAC;AAElF,MAAMC,QAAQ,GAAGjC,QAAQ,CAAEkC,KAAU,IAAK;EACtClB,WAAW,CAACjB,QAAQ,CAACmC,KAAK,CAAC,CAAC;EAC5BrB,OAAO,CAACM,IAAI,CAAC,CAAC,CAAC;AACnB,CAAC,CAAC;AAEFjB,QAAQ,CAACiC,MAAM,cACXlC,KAAA,CAAAmC,aAAA,CAAC9B,yBAAyB,qBACtBL,KAAA,CAAAmC,aAAA,CAAC/B,WAAW,qBACRJ,KAAA,CAAAmC,aAAA,CAACtC,UAAU;EAACmC,QAAQ,EAAEA;AAAS,gBAC3BhC,KAAA,CAAAmC,aAAA,CAACP,UAAU,MAAE,CACL,CACH,CACU,CAC/B,CAAC","ignoreList":[]}
|
|
@@ -18,7 +18,7 @@ const getVersionFromVersionFolders = async (versionFoldersList, currentWebinyVer
|
|
|
18
18
|
let versionToUse = "";
|
|
19
19
|
|
|
20
20
|
// When developing Webiny, we want to use the latest version.
|
|
21
|
-
if (currentWebinyVersion
|
|
21
|
+
if (currentWebinyVersion.startsWith(WEBINY_DEV_VERSION)) {
|
|
22
22
|
versionToUse = availableVersions[availableVersions.length - 1];
|
|
23
23
|
} else {
|
|
24
24
|
for (const availableVersion of availableVersions) {
|
|
@@ -42,12 +42,26 @@ class DefaultInstallExtensionService {
|
|
|
42
42
|
const projectRoot = project.paths.rootFolder.toString();
|
|
43
43
|
const randomId = String(Date.now());
|
|
44
44
|
const downloadFolderPath = path.join(os.tmpdir(), `wby-ext-${randomId}`);
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
45
|
+
|
|
46
|
+
// Check if source is a local path
|
|
47
|
+
const isLocalPath = source.startsWith("../") || source.startsWith("./") || source.startsWith("/");
|
|
48
|
+
if (isLocalPath) {
|
|
49
|
+
// Resolve the local path relative to the project root
|
|
50
|
+
const resolvedPath = path.isAbsolute(source) ? source : path.resolve(projectRoot, source);
|
|
51
|
+
|
|
52
|
+
// Copy the local directory to the temporary download folder
|
|
53
|
+
await fsAsync.cp(resolvedPath, downloadFolderPath, {
|
|
54
|
+
recursive: true
|
|
55
|
+
});
|
|
56
|
+
} else {
|
|
57
|
+
// Download from S3
|
|
58
|
+
await downloadFolderFromS3({
|
|
59
|
+
bucketName: S3_BUCKET_NAME,
|
|
60
|
+
bucketRegion: S3_BUCKET_REGION,
|
|
61
|
+
bucketFolderKey: source,
|
|
62
|
+
downloadFolderPath
|
|
63
|
+
});
|
|
64
|
+
}
|
|
51
65
|
let extensionsFolderToCopyPath = path.join(downloadFolderPath, "extensions");
|
|
52
66
|
let extensionJsonPath = path.join(downloadFolderPath, "extension.json");
|
|
53
67
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["os","path","fs","fsAsync","loadJsonFile","createImplementation","InstallExtensionService","GetProjectVersionService","GetProjectService","downloadFolderFromS3","mergePackageJson","updateWebinyConfig","EXTENSIONS_ROOT_FOLDER","S3_BUCKET_NAME","S3_BUCKET_REGION","FOLDER_NAME_IS_VERSION_REGEX","WEBINY_DEV_VERSION","getVersionFromVersionFolders","versionFoldersList","currentWebinyVersion","availableVersions","filter","v","match","map","replace","sort","versionToUse","length","availableVersion","DefaultInstallExtensionService","constructor","getProjectVersion","getProject","execute","source","project","projectRoot","paths","rootFolder","toString","randomId","String","Date","now","downloadFolderPath","join","tmpdir","bucketName","bucketRegion","bucketFolderKey","extensionsFolderToCopyPath","extensionJsonPath","extensionsFolderExistsInRoot","existsSync","versionedExtension","versionFolders","readdir","subExtensionJsonPath","extensionJsonExists","extensionJson","name","type","targetExtensionsFolder","mkdirSync","recursive","cp","extensionsFolderNames","extensionPaths","packageJson","Object","keys","extensionPackageJson","webinyConfigTsx","nextSteps","messages","additionalNotes","extensionName","installExtensionService","abstraction","implementation","dependencies"],"sources":["InstallExtensionService.ts"],"sourcesContent":["import os from \"os\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport fsAsync from \"fs/promises\";\nimport loadJsonFile from \"load-json-file\";\nimport { createImplementation } from \"@webiny/di\";\nimport {\n InstallExtensionService,\n GetProjectVersionService,\n GetProjectService\n} from \"~/abstractions/index.js\";\nimport { downloadFolderFromS3 } from \"./downloadFolderFromS3.js\";\nimport { mergePackageJson } from \"./mergePackageJson.js\";\nimport { updateWebinyConfig } from \"./updateWebinyConfig.js\";\nimport type { ExtensionJson } from \"./types.js\";\n\nconst EXTENSIONS_ROOT_FOLDER = \"extensions\";\nconst S3_BUCKET_NAME = \"webiny-examples\";\nconst S3_BUCKET_REGION = \"us-east-1\";\nconst FOLDER_NAME_IS_VERSION_REGEX = /^\\d+\\.\\d+\\.x$/;\nconst WEBINY_DEV_VERSION = \"0.0.0\";\n\nconst getVersionFromVersionFolders = async (\n versionFoldersList: string[],\n currentWebinyVersion: string\n) => {\n const availableVersions = versionFoldersList\n .filter(v => v.match(FOLDER_NAME_IS_VERSION_REGEX))\n .map(v => v.replace(/\\.x$/, \".0\"))\n .sort();\n\n let versionToUse = \"\";\n\n // When developing Webiny, we want to use the latest version.\n if (currentWebinyVersion === WEBINY_DEV_VERSION) {\n versionToUse = availableVersions[availableVersions.length - 1];\n } else {\n for (const availableVersion of availableVersions) {\n if (currentWebinyVersion >= availableVersion) {\n versionToUse = availableVersion;\n } else {\n break;\n }\n }\n }\n\n return versionToUse.replace(/\\.0$/, \".x\");\n};\n\nclass DefaultInstallExtensionService implements InstallExtensionService.Interface {\n constructor(\n private getProjectVersion: GetProjectVersionService.Interface,\n private getProject: GetProjectService.Interface\n ) {}\n\n async execute(source: string): Promise<InstallExtensionService.Result> {\n const currentWebinyVersion = this.getProjectVersion.execute();\n const project = this.getProject.execute();\n const projectRoot = project.paths.rootFolder.toString();\n\n const randomId = String(Date.now());\n const downloadFolderPath = path.join(os.tmpdir(), `wby-ext-${randomId}`);\n\n await downloadFolderFromS3({\n bucketName: S3_BUCKET_NAME,\n bucketRegion: S3_BUCKET_REGION,\n bucketFolderKey: source,\n downloadFolderPath\n });\n\n let extensionsFolderToCopyPath = path.join(downloadFolderPath, \"extensions\");\n let extensionJsonPath = path.join(downloadFolderPath, \"extension.json\");\n\n // If we have `extensions` folder in the root of the downloaded extension,\n // it means the extension is not versioned, and we can just copy it.\n const extensionsFolderExistsInRoot = fs.existsSync(extensionsFolderToCopyPath);\n const versionedExtension = !extensionsFolderExistsInRoot;\n\n if (versionedExtension) {\n // If we have `x.x.x` folders in the root of the downloaded\n // extension, we need to find the right version to use.\n\n // This can be `5.40.x`, `6.0.x`, etc.\n const versionFolders = await fsAsync.readdir(downloadFolderPath);\n\n const versionToUse = await getVersionFromVersionFolders(\n versionFolders,\n currentWebinyVersion\n );\n\n extensionsFolderToCopyPath = path.join(downloadFolderPath, versionToUse, \"extensions\");\n const subExtensionJsonPath = path.join(\n downloadFolderPath,\n versionToUse,\n \"extension.json\"\n );\n if (fs.existsSync(subExtensionJsonPath)) {\n extensionJsonPath = subExtensionJsonPath;\n }\n }\n\n // Read and parse extension.json.\n const extensionJsonExists = fs.existsSync(extensionJsonPath);\n const extensionJson: ExtensionJson = extensionJsonExists\n ? await loadJsonFile(extensionJsonPath)\n : { name: \"unknown\", type: \"admin\" };\n\n // Ensure the extensions root folder exists.\n const targetExtensionsFolder = path.join(projectRoot, EXTENSIONS_ROOT_FOLDER);\n if (!fs.existsSync(targetExtensionsFolder)) {\n fs.mkdirSync(targetExtensionsFolder, { recursive: true });\n }\n\n // Copy the extensions folder contents.\n await fsAsync.cp(extensionsFolderToCopyPath, targetExtensionsFolder, {\n recursive: true\n });\n\n // Get the list of extensions that were copied.\n const extensionsFolderNames = await fsAsync.readdir(extensionsFolderToCopyPath);\n const extensionPaths = extensionsFolderNames.map(name =>\n path.join(EXTENSIONS_ROOT_FOLDER, name)\n );\n\n // Merge package.json if provided.\n if (extensionJson.packageJson && Object.keys(extensionJson.packageJson).length > 0) {\n await mergePackageJson({\n projectRoot,\n extensionPackageJson: extensionJson.packageJson\n });\n }\n\n // Update webiny.config.tsx if provided.\n if (extensionJson.webinyConfigTsx) {\n await updateWebinyConfig({\n projectRoot,\n webinyConfigTsx: extensionJson.webinyConfigTsx\n });\n }\n\n // Extract next steps and additional notes.\n const nextSteps = extensionJson.nextSteps?.messages || [];\n const additionalNotes = extensionJson.additionalNotes?.messages || [];\n\n return {\n extensionName: extensionJson.name,\n extensionPaths,\n nextSteps,\n additionalNotes\n };\n }\n}\n\nexport const installExtensionService = createImplementation({\n abstraction: InstallExtensionService,\n implementation: DefaultInstallExtensionService,\n dependencies: [GetProjectVersionService, GetProjectService]\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["os","path","fs","fsAsync","loadJsonFile","createImplementation","InstallExtensionService","GetProjectVersionService","GetProjectService","downloadFolderFromS3","mergePackageJson","updateWebinyConfig","EXTENSIONS_ROOT_FOLDER","S3_BUCKET_NAME","S3_BUCKET_REGION","FOLDER_NAME_IS_VERSION_REGEX","WEBINY_DEV_VERSION","getVersionFromVersionFolders","versionFoldersList","currentWebinyVersion","availableVersions","filter","v","match","map","replace","sort","versionToUse","startsWith","length","availableVersion","DefaultInstallExtensionService","constructor","getProjectVersion","getProject","execute","source","project","projectRoot","paths","rootFolder","toString","randomId","String","Date","now","downloadFolderPath","join","tmpdir","isLocalPath","resolvedPath","isAbsolute","resolve","cp","recursive","bucketName","bucketRegion","bucketFolderKey","extensionsFolderToCopyPath","extensionJsonPath","extensionsFolderExistsInRoot","existsSync","versionedExtension","versionFolders","readdir","subExtensionJsonPath","extensionJsonExists","extensionJson","name","type","targetExtensionsFolder","mkdirSync","extensionsFolderNames","extensionPaths","packageJson","Object","keys","extensionPackageJson","webinyConfigTsx","nextSteps","messages","additionalNotes","extensionName","installExtensionService","abstraction","implementation","dependencies"],"sources":["InstallExtensionService.ts"],"sourcesContent":["import os from \"os\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport fsAsync from \"fs/promises\";\nimport loadJsonFile from \"load-json-file\";\nimport { createImplementation } from \"@webiny/di\";\nimport {\n InstallExtensionService,\n GetProjectVersionService,\n GetProjectService\n} from \"~/abstractions/index.js\";\nimport { downloadFolderFromS3 } from \"./downloadFolderFromS3.js\";\nimport { mergePackageJson } from \"./mergePackageJson.js\";\nimport { updateWebinyConfig } from \"./updateWebinyConfig.js\";\nimport type { ExtensionJson } from \"./types.js\";\n\nconst EXTENSIONS_ROOT_FOLDER = \"extensions\";\nconst S3_BUCKET_NAME = \"webiny-examples\";\nconst S3_BUCKET_REGION = \"us-east-1\";\nconst FOLDER_NAME_IS_VERSION_REGEX = /^\\d+\\.\\d+\\.x$/;\nconst WEBINY_DEV_VERSION = \"0.0.0\";\n\nconst getVersionFromVersionFolders = async (\n versionFoldersList: string[],\n currentWebinyVersion: string\n) => {\n const availableVersions = versionFoldersList\n .filter(v => v.match(FOLDER_NAME_IS_VERSION_REGEX))\n .map(v => v.replace(/\\.x$/, \".0\"))\n .sort();\n\n let versionToUse = \"\";\n\n // When developing Webiny, we want to use the latest version.\n if (currentWebinyVersion.startsWith(WEBINY_DEV_VERSION)) {\n versionToUse = availableVersions[availableVersions.length - 1];\n } else {\n for (const availableVersion of availableVersions) {\n if (currentWebinyVersion >= availableVersion) {\n versionToUse = availableVersion;\n } else {\n break;\n }\n }\n }\n\n return versionToUse.replace(/\\.0$/, \".x\");\n};\n\nclass DefaultInstallExtensionService implements InstallExtensionService.Interface {\n constructor(\n private getProjectVersion: GetProjectVersionService.Interface,\n private getProject: GetProjectService.Interface\n ) {}\n\n async execute(source: string): Promise<InstallExtensionService.Result> {\n const currentWebinyVersion = this.getProjectVersion.execute();\n const project = this.getProject.execute();\n const projectRoot = project.paths.rootFolder.toString();\n\n const randomId = String(Date.now());\n const downloadFolderPath = path.join(os.tmpdir(), `wby-ext-${randomId}`);\n\n // Check if source is a local path\n const isLocalPath =\n source.startsWith(\"../\") || source.startsWith(\"./\") || source.startsWith(\"/\");\n\n if (isLocalPath) {\n // Resolve the local path relative to the project root\n const resolvedPath = path.isAbsolute(source)\n ? source\n : path.resolve(projectRoot, source);\n\n // Copy the local directory to the temporary download folder\n await fsAsync.cp(resolvedPath, downloadFolderPath, {\n recursive: true\n });\n } else {\n // Download from S3\n await downloadFolderFromS3({\n bucketName: S3_BUCKET_NAME,\n bucketRegion: S3_BUCKET_REGION,\n bucketFolderKey: source,\n downloadFolderPath\n });\n }\n\n let extensionsFolderToCopyPath = path.join(downloadFolderPath, \"extensions\");\n let extensionJsonPath = path.join(downloadFolderPath, \"extension.json\");\n\n // If we have `extensions` folder in the root of the downloaded extension,\n // it means the extension is not versioned, and we can just copy it.\n const extensionsFolderExistsInRoot = fs.existsSync(extensionsFolderToCopyPath);\n const versionedExtension = !extensionsFolderExistsInRoot;\n\n if (versionedExtension) {\n // If we have `x.x.x` folders in the root of the downloaded\n // extension, we need to find the right version to use.\n\n // This can be `5.40.x`, `6.0.x`, etc.\n const versionFolders = await fsAsync.readdir(downloadFolderPath);\n\n const versionToUse = await getVersionFromVersionFolders(\n versionFolders,\n currentWebinyVersion\n );\n\n extensionsFolderToCopyPath = path.join(downloadFolderPath, versionToUse, \"extensions\");\n const subExtensionJsonPath = path.join(\n downloadFolderPath,\n versionToUse,\n \"extension.json\"\n );\n if (fs.existsSync(subExtensionJsonPath)) {\n extensionJsonPath = subExtensionJsonPath;\n }\n }\n\n // Read and parse extension.json.\n const extensionJsonExists = fs.existsSync(extensionJsonPath);\n const extensionJson: ExtensionJson = extensionJsonExists\n ? await loadJsonFile(extensionJsonPath)\n : { name: \"unknown\", type: \"admin\" };\n\n // Ensure the extensions root folder exists.\n const targetExtensionsFolder = path.join(projectRoot, EXTENSIONS_ROOT_FOLDER);\n if (!fs.existsSync(targetExtensionsFolder)) {\n fs.mkdirSync(targetExtensionsFolder, { recursive: true });\n }\n\n // Copy the extensions folder contents.\n await fsAsync.cp(extensionsFolderToCopyPath, targetExtensionsFolder, {\n recursive: true\n });\n\n // Get the list of extensions that were copied.\n const extensionsFolderNames = await fsAsync.readdir(extensionsFolderToCopyPath);\n const extensionPaths = extensionsFolderNames.map(name =>\n path.join(EXTENSIONS_ROOT_FOLDER, name)\n );\n\n // Merge package.json if provided.\n if (extensionJson.packageJson && Object.keys(extensionJson.packageJson).length > 0) {\n await mergePackageJson({\n projectRoot,\n extensionPackageJson: extensionJson.packageJson\n });\n }\n\n // Update webiny.config.tsx if provided.\n if (extensionJson.webinyConfigTsx) {\n await updateWebinyConfig({\n projectRoot,\n webinyConfigTsx: extensionJson.webinyConfigTsx\n });\n }\n\n // Extract next steps and additional notes.\n const nextSteps = extensionJson.nextSteps?.messages || [];\n const additionalNotes = extensionJson.additionalNotes?.messages || [];\n\n return {\n extensionName: extensionJson.name,\n extensionPaths,\n nextSteps,\n additionalNotes\n };\n }\n}\n\nexport const installExtensionService = createImplementation({\n abstraction: InstallExtensionService,\n implementation: DefaultInstallExtensionService,\n dependencies: [GetProjectVersionService, GetProjectService]\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,4 +1,43 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
|
+
/**
|
|
3
|
+
* Serializes a props object to JSX attribute syntax.
|
|
4
|
+
* Examples:
|
|
5
|
+
* - { secretKey: "value" } => 'secretKey={"value"}'
|
|
6
|
+
* - { enabled: true } => 'enabled={true}'
|
|
7
|
+
* - { count: 42 } => 'count={42}'
|
|
8
|
+
* - { config: { key: "value" } } => 'config={{"key":"value"}}'
|
|
9
|
+
*/
|
|
10
|
+
const serializePropsToJsx = props => {
|
|
11
|
+
const attributes = [];
|
|
12
|
+
for (const [key, value] of Object.entries(props)) {
|
|
13
|
+
// Skip undefined values
|
|
14
|
+
if (value === undefined) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Determine the serialization based on value type
|
|
19
|
+
let serializedValue;
|
|
20
|
+
if (typeof value === "string") {
|
|
21
|
+
// Strings: use JSON.stringify to handle escaping, then wrap in curly braces
|
|
22
|
+
serializedValue = `{${JSON.stringify(value)}}`;
|
|
23
|
+
} else if (typeof value === "number" || typeof value === "boolean") {
|
|
24
|
+
// Numbers and booleans: wrap in curly braces without quotes
|
|
25
|
+
serializedValue = `{${value}}`;
|
|
26
|
+
} else if (value === null) {
|
|
27
|
+
// Null values
|
|
28
|
+
serializedValue = `{null}`;
|
|
29
|
+
} else if (Array.isArray(value) || typeof value === "object") {
|
|
30
|
+
// Arrays and objects: use JSON.stringify, then wrap in curly braces
|
|
31
|
+
serializedValue = `{${JSON.stringify(value)}}`;
|
|
32
|
+
} else {
|
|
33
|
+
// Fallback for any other types
|
|
34
|
+
serializedValue = `{${JSON.stringify(value)}}`;
|
|
35
|
+
}
|
|
36
|
+
attributes.push(`${key}=${serializedValue}`);
|
|
37
|
+
}
|
|
38
|
+
return attributes.join(" ");
|
|
39
|
+
};
|
|
40
|
+
|
|
2
41
|
/**
|
|
3
42
|
* Update the webiny.config.tsx file to add extension imports and component.
|
|
4
43
|
*/
|
|
@@ -38,7 +77,13 @@ export const updateWebinyConfig = async params => {
|
|
|
38
77
|
// Add component to the Extensions function
|
|
39
78
|
if (webinyConfigTsx.component) {
|
|
40
79
|
const componentName = webinyConfigTsx.component.name;
|
|
41
|
-
const
|
|
80
|
+
const props = webinyConfigTsx.component.props;
|
|
81
|
+
|
|
82
|
+
// Serialize props to JSX attributes
|
|
83
|
+
const propsString = props ? serializePropsToJsx(props) : "";
|
|
84
|
+
|
|
85
|
+
// Generate component tag with or without props
|
|
86
|
+
const componentTag = propsString ? `<${componentName} ${propsString} />` : `<${componentName} />`;
|
|
42
87
|
|
|
43
88
|
// Check if component already exists
|
|
44
89
|
if (!content.includes(componentTag)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["fs","updateWebinyConfig","params","projectRoot","webinyConfigTsx","webinyConfigPath","content","readFileSync","imports","length","importStatement","importLine","specifier","path","includes","importRegex","matches","Array","from","matchAll","lastImport","lastImportEnd","index","slice","component","componentName","name","componentTag","extensionsFuncRegex","extensionsFuncMatch","match","funcContent","closingTags","lastClosingTag","lastClosingTagIndex","beforeClosing","substring","lines","split","lastLine","indent","newFuncContent","replace","writeFileSync"],"sources":["updateWebinyConfig.ts"],"sourcesContent":["import fs from \"fs\";\nimport { ExtensionWebinyConfigTsx } from \"./types.js\";\n\ninterface UpdateWebinyConfigParams {\n projectRoot: string;\n webinyConfigTsx: ExtensionWebinyConfigTsx;\n}\n\n/**\n * Update the webiny.config.tsx file to add extension imports and component.\n */\nexport const updateWebinyConfig = async (params: UpdateWebinyConfigParams): Promise<void> => {\n const { projectRoot, webinyConfigTsx } = params;\n\n const webinyConfigPath = `${projectRoot}/webiny.config.tsx`;\n\n // Read the current webiny.config.tsx\n let content = fs.readFileSync(webinyConfigPath, \"utf-8\");\n\n // Add imports at the top (after existing imports)\n if (webinyConfigTsx.imports && webinyConfigTsx.imports.length > 0) {\n for (const importStatement of webinyConfigTsx.imports) {\n const importLine = `import { ${importStatement.specifier} } from \"${importStatement.path}\";`;\n\n // Check if import already exists\n if (!content.includes(importLine)) {\n // Find the position after the last import or at the beginning\n const importRegex = /^import\\s+.*?from\\s+[\"'].*?[\"'];?\\s*$/gm;\n const matches = Array.from(content.matchAll(importRegex));\n\n if (matches.length > 0) {\n // Add after the last import\n const lastImport = matches[matches.length - 1];\n const lastImportEnd = lastImport.index! + lastImport[0].length;\n content =\n content.slice(0, lastImportEnd) +\n \"\\n\" +\n importLine +\n content.slice(lastImportEnd);\n } else {\n // No imports found, add at the beginning\n content = importLine + \"\\n\\n\" + content;\n }\n }\n }\n }\n\n // Add component to the Extensions function\n if (webinyConfigTsx.component) {\n const componentName = webinyConfigTsx.component.name;\n const componentTag = `<${componentName} />`;\n\n // Check if component already exists\n if (!content.includes(componentTag)) {\n // Find the Extensions function's return statement and add component before the final </>\n // Strategy: Find \"export const Extensions\" block, then find the last </> and insert before it\n const extensionsFuncRegex = /export const Extensions = \\(\\) => \\{[\\s\\S]*?\\};/;\n const extensionsFuncMatch = content.match(extensionsFuncRegex);\n\n if (extensionsFuncMatch) {\n const funcContent = extensionsFuncMatch[0];\n // Find all </> in the function - the last one closes the return statement\n const closingTags = [...funcContent.matchAll(/<\\/>/g)];\n\n if (closingTags.length > 0) {\n const lastClosingTag = closingTags[closingTags.length - 1];\n const lastClosingTagIndex = lastClosingTag.index!;\n\n // Find the indentation of the line containing the last </>\n const beforeClosing = funcContent.substring(0, lastClosingTagIndex);\n const lines = beforeClosing.split(\"\\n\");\n const lastLine = lines[lines.length - 1];\n const indent = lastLine.match(/^(\\s*)/)?.[1] || \" \";\n\n // Insert the component before the last </>\n const newFuncContent =\n funcContent.substring(0, lastClosingTagIndex) +\n `${indent}${componentTag}\\n${indent}` +\n funcContent.substring(lastClosingTagIndex);\n\n content = content.replace(extensionsFuncRegex, newFuncContent);\n }\n }\n }\n }\n\n // Write the updated content back\n fs.writeFileSync(webinyConfigPath, content, \"utf-8\");\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["fs","serializePropsToJsx","props","attributes","key","value","Object","entries","undefined","serializedValue","JSON","stringify","Array","isArray","push","join","updateWebinyConfig","params","projectRoot","webinyConfigTsx","webinyConfigPath","content","readFileSync","imports","length","importStatement","importLine","specifier","path","includes","importRegex","matches","from","matchAll","lastImport","lastImportEnd","index","slice","component","componentName","name","propsString","componentTag","extensionsFuncRegex","extensionsFuncMatch","match","funcContent","closingTags","lastClosingTag","lastClosingTagIndex","beforeClosing","substring","lines","split","lastLine","indent","newFuncContent","replace","writeFileSync"],"sources":["updateWebinyConfig.ts"],"sourcesContent":["import fs from \"fs\";\nimport { ExtensionWebinyConfigTsx } from \"./types.js\";\n\ninterface UpdateWebinyConfigParams {\n projectRoot: string;\n webinyConfigTsx: ExtensionWebinyConfigTsx;\n}\n\n/**\n * Serializes a props object to JSX attribute syntax.\n * Examples:\n * - { secretKey: \"value\" } => 'secretKey={\"value\"}'\n * - { enabled: true } => 'enabled={true}'\n * - { count: 42 } => 'count={42}'\n * - { config: { key: \"value\" } } => 'config={{\"key\":\"value\"}}'\n */\nconst serializePropsToJsx = (props: Record<string, any>): string => {\n const attributes: string[] = [];\n\n for (const [key, value] of Object.entries(props)) {\n // Skip undefined values\n if (value === undefined) {\n continue;\n }\n\n // Determine the serialization based on value type\n let serializedValue: string;\n\n if (typeof value === \"string\") {\n // Strings: use JSON.stringify to handle escaping, then wrap in curly braces\n serializedValue = `{${JSON.stringify(value)}}`;\n } else if (typeof value === \"number\" || typeof value === \"boolean\") {\n // Numbers and booleans: wrap in curly braces without quotes\n serializedValue = `{${value}}`;\n } else if (value === null) {\n // Null values\n serializedValue = `{null}`;\n } else if (Array.isArray(value) || typeof value === \"object\") {\n // Arrays and objects: use JSON.stringify, then wrap in curly braces\n serializedValue = `{${JSON.stringify(value)}}`;\n } else {\n // Fallback for any other types\n serializedValue = `{${JSON.stringify(value)}}`;\n }\n\n attributes.push(`${key}=${serializedValue}`);\n }\n\n return attributes.join(\" \");\n};\n\n/**\n * Update the webiny.config.tsx file to add extension imports and component.\n */\nexport const updateWebinyConfig = async (params: UpdateWebinyConfigParams): Promise<void> => {\n const { projectRoot, webinyConfigTsx } = params;\n\n const webinyConfigPath = `${projectRoot}/webiny.config.tsx`;\n\n // Read the current webiny.config.tsx\n let content = fs.readFileSync(webinyConfigPath, \"utf-8\");\n\n // Add imports at the top (after existing imports)\n if (webinyConfigTsx.imports && webinyConfigTsx.imports.length > 0) {\n for (const importStatement of webinyConfigTsx.imports) {\n const importLine = `import { ${importStatement.specifier} } from \"${importStatement.path}\";`;\n\n // Check if import already exists\n if (!content.includes(importLine)) {\n // Find the position after the last import or at the beginning\n const importRegex = /^import\\s+.*?from\\s+[\"'].*?[\"'];?\\s*$/gm;\n const matches = Array.from(content.matchAll(importRegex));\n\n if (matches.length > 0) {\n // Add after the last import\n const lastImport = matches[matches.length - 1];\n const lastImportEnd = lastImport.index! + lastImport[0].length;\n content =\n content.slice(0, lastImportEnd) +\n \"\\n\" +\n importLine +\n content.slice(lastImportEnd);\n } else {\n // No imports found, add at the beginning\n content = importLine + \"\\n\\n\" + content;\n }\n }\n }\n }\n\n // Add component to the Extensions function\n if (webinyConfigTsx.component) {\n const componentName = webinyConfigTsx.component.name;\n const props = webinyConfigTsx.component.props;\n\n // Serialize props to JSX attributes\n const propsString = props ? serializePropsToJsx(props) : \"\";\n\n // Generate component tag with or without props\n const componentTag = propsString\n ? `<${componentName} ${propsString} />`\n : `<${componentName} />`;\n\n // Check if component already exists\n if (!content.includes(componentTag)) {\n // Find the Extensions function's return statement and add component before the final </>\n // Strategy: Find \"export const Extensions\" block, then find the last </> and insert before it\n const extensionsFuncRegex = /export const Extensions = \\(\\) => \\{[\\s\\S]*?\\};/;\n const extensionsFuncMatch = content.match(extensionsFuncRegex);\n\n if (extensionsFuncMatch) {\n const funcContent = extensionsFuncMatch[0];\n // Find all </> in the function - the last one closes the return statement\n const closingTags = [...funcContent.matchAll(/<\\/>/g)];\n\n if (closingTags.length > 0) {\n const lastClosingTag = closingTags[closingTags.length - 1];\n const lastClosingTagIndex = lastClosingTag.index!;\n\n // Find the indentation of the line containing the last </>\n const beforeClosing = funcContent.substring(0, lastClosingTagIndex);\n const lines = beforeClosing.split(\"\\n\");\n const lastLine = lines[lines.length - 1];\n const indent = lastLine.match(/^(\\s*)/)?.[1] || \" \";\n\n // Insert the component before the last </>\n const newFuncContent =\n funcContent.substring(0, lastClosingTagIndex) +\n `${indent}${componentTag}\\n${indent}` +\n funcContent.substring(lastClosingTagIndex);\n\n content = content.replace(extensionsFuncRegex, newFuncContent);\n }\n }\n }\n }\n\n // Write the updated content back\n fs.writeFileSync(webinyConfigPath, content, \"utf-8\");\n};\n"],"mappings":"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","ignoreList":[]}
|