@webiny/project 0.0.0-unstable.df7a8bb475 → 0.0.0-unstable.e2758ee1cf
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/ProjectSdk.d.ts +1 -0
- package/ProjectSdk.js +4 -1
- package/ProjectSdk.js.map +1 -1
- package/abstractions/features/GetFeatureFlags.d.ts +8 -0
- package/abstractions/features/GetFeatureFlags.js +4 -0
- package/abstractions/features/GetFeatureFlags.js.map +1 -0
- package/abstractions/features/index.d.ts +1 -0
- package/abstractions/features/index.js +1 -0
- package/abstractions/features/index.js.map +1 -1
- package/abstractions/services/WatchedLambdaFunctionsService.d.ts +12 -7
- package/abstractions/services/WatchedLambdaFunctionsService.js.map +1 -1
- package/components/Wcp.d.ts +2 -0
- package/components/Wcp.js +8 -1
- package/components/Wcp.js.map +1 -1
- package/createProjectSdkContainer.js +4 -1
- package/createProjectSdkContainer.js.map +1 -1
- package/decorators/DeployAppClearWatchedLambdaFunctions.d.ts +3 -2
- package/decorators/DeployAppClearWatchedLambdaFunctions.js +11 -5
- package/decorators/DeployAppClearWatchedLambdaFunctions.js.map +1 -1
- package/decorators/DeployAppWithWatchedLambdaReplacement.d.ts +3 -2
- package/decorators/DeployAppWithWatchedLambdaReplacement.js +16 -7
- package/decorators/DeployAppWithWatchedLambdaReplacement.js.map +1 -1
- package/decorators/GetFeatureFlagsWithLicense.d.ts +13 -0
- package/decorators/GetFeatureFlagsWithLicense.js +71 -0
- package/decorators/GetFeatureFlagsWithLicense.js.map +1 -0
- package/decorators/index.d.ts +1 -0
- package/decorators/index.js +1 -0
- package/decorators/index.js.map +1 -1
- package/defineExtension/createExtensionReactComponent.js +2 -6
- package/defineExtension/createExtensionReactComponent.js.map +1 -1
- package/defineExtension/index.d.ts +0 -1
- package/defineExtension/index.js +0 -1
- package/defineExtension/index.js.map +1 -1
- package/defineExtension/zodTypes/zodSrcPath.d.ts +1 -0
- package/defineExtension/zodTypes/zodSrcPath.js +7 -14
- package/defineExtension/zodTypes/zodSrcPath.js.map +1 -1
- package/exports/infra/index.d.ts +1 -1
- package/exports/infra/index.js +1 -1
- package/exports/infra/index.js.map +1 -1
- package/extensions/AdminBuildParam.d.ts +11 -0
- package/extensions/AdminBuildParam.js +184 -0
- package/extensions/AdminBuildParam.js.map +1 -0
- package/extensions/AdminExtension.d.ts +11 -0
- package/extensions/AdminExtension.js +99 -0
- package/extensions/AdminExtension.js.map +1 -0
- package/extensions/ApiBuildParam.d.ts +11 -0
- package/extensions/ApiBuildParam.js +119 -0
- package/extensions/ApiBuildParam.js.map +1 -0
- package/extensions/ApiExtension.d.ts +11 -0
- package/{defineExtension/defineApiExtension.js → extensions/ApiExtension.js} +14 -22
- package/extensions/ApiExtension.js.map +1 -0
- package/extensions/FeatureFlags.d.ts +92 -0
- package/extensions/FeatureFlags.js +43 -0
- package/extensions/FeatureFlags.js.map +1 -0
- package/extensions/index.d.ts +109 -0
- package/extensions/index.js +12 -2
- package/extensions/index.js.map +1 -1
- package/features/GetFeatureFlags/GetFeatureFlags.d.ts +10 -0
- package/features/GetFeatureFlags/GetFeatureFlags.js +29 -0
- package/features/GetFeatureFlags/GetFeatureFlags.js.map +1 -0
- package/features/GetFeatureFlags/index.d.ts +1 -0
- package/features/GetFeatureFlags/index.js +3 -0
- package/features/GetFeatureFlags/index.js.map +1 -0
- package/features/Watch/Watch.js +1 -0
- package/features/Watch/Watch.js.map +1 -1
- package/features/Watch/replaceLambdaFunctions.d.ts +2 -1
- package/features/Watch/replaceLambdaFunctions.js +5 -1
- package/features/Watch/replaceLambdaFunctions.js.map +1 -1
- package/features/index.d.ts +1 -0
- package/features/index.js +1 -0
- package/features/index.js.map +1 -1
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/package.json +17 -16
- package/services/GetProjectConfigService/WcpProjectLicenseContext.d.ts +1 -0
- package/services/GetProjectConfigService/WcpProjectLicenseContext.js +2 -1
- package/services/GetProjectConfigService/WcpProjectLicenseContext.js.map +1 -1
- package/services/InitProjectSdkService/registerDecorators.js +2 -2
- package/services/InitProjectSdkService/registerDecorators.js.map +1 -1
- package/services/InitProjectSdkService/registerHooks.js +2 -2
- package/services/InitProjectSdkService/registerHooks.js.map +1 -1
- package/services/InitProjectSdkService/registerImplementations.js +2 -2
- package/services/InitProjectSdkService/registerImplementations.js.map +1 -1
- package/services/InitProjectSdkService/registerPulumiExtensions.js +2 -2
- package/services/InitProjectSdkService/registerPulumiExtensions.js.map +1 -1
- package/services/InstallExtensionService/InstallExtensionService.d.ts +1 -1
- package/services/InstallExtensionService/InstallExtensionService.js +3 -3
- package/services/InstallExtensionService/InstallExtensionService.js.map +1 -1
- package/services/InstallExtensionService/mergePackageJson.js +4 -4
- package/services/InstallExtensionService/mergePackageJson.js.map +1 -1
- package/services/ListAppLambdaFunctionsService/ListAppLambdaFunctionsService.js +1 -1
- package/services/ListAppLambdaFunctionsService/ListAppLambdaFunctionsService.js.map +1 -1
- package/services/SetProjectIdService/SetProjectIdService.js +28 -18
- package/services/SetProjectIdService/SetProjectIdService.js.map +1 -1
- package/services/WatchedLambdaFunctionsService/WatchedLambdaFunctionsService.d.ts +4 -4
- package/services/WatchedLambdaFunctionsService/WatchedLambdaFunctionsService.js +26 -20
- package/services/WatchedLambdaFunctionsService/WatchedLambdaFunctionsService.js.map +1 -1
- package/utils/ExtensionSrcResolver.d.ts +33 -0
- package/utils/ExtensionSrcResolver.js +119 -0
- package/utils/ExtensionSrcResolver.js.map +1 -0
- package/utils/index.d.ts +1 -1
- package/utils/index.js +1 -1
- package/utils/index.js.map +1 -1
- package/defineExtension/defineApiExtension.d.ts +0 -17
- package/defineExtension/defineApiExtension.js.map +0 -1
- package/exports/extensions.d.ts +0 -1
- package/exports/extensions.js +0 -3
- package/exports/extensions.js.map +0 -1
- package/utils/ImplPathResolver.d.ts +0 -10
- package/utils/ImplPathResolver.js +0 -27
- package/utils/ImplPathResolver.js.map +0 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type IProjectModel } from "../abstractions/models/index.js";
|
|
2
|
+
export declare class ExtensionSrcResolver {
|
|
3
|
+
private static pathMappings;
|
|
4
|
+
/**
|
|
5
|
+
* Import a module from a given file path.
|
|
6
|
+
* - If path starts with "/extensions/", it resolves from project root
|
|
7
|
+
* - If path matches tsconfig path alias (e.g., "@/*"), it resolves using tsconfig
|
|
8
|
+
* - Otherwise, treats path as absolute
|
|
9
|
+
* Returns the default export or named export matching the filename.
|
|
10
|
+
*/
|
|
11
|
+
static importFromPath(filePath: string, project: IProjectModel): Promise<any>;
|
|
12
|
+
/**
|
|
13
|
+
* Resolve a file path to an absolute path.
|
|
14
|
+
* - If path starts with "/extensions/", it resolves from project root
|
|
15
|
+
* - If path matches tsconfig path alias (e.g., "@/*"), it resolves using tsconfig
|
|
16
|
+
* - Otherwise, treats path as absolute
|
|
17
|
+
* Returns the absolute path without importing.
|
|
18
|
+
*/
|
|
19
|
+
static resolvePath(filePath: string, project: IProjectModel): string;
|
|
20
|
+
/**
|
|
21
|
+
* Check if a file exists at the given path.
|
|
22
|
+
* Resolves the path using the same logic as resolvePath before checking.
|
|
23
|
+
* - If path starts with "/extensions/", it resolves from project root
|
|
24
|
+
* - If path matches tsconfig path alias (e.g., "@/*"), it resolves using tsconfig
|
|
25
|
+
* - Otherwise, treats path as absolute
|
|
26
|
+
* Returns true if the file exists, false otherwise.
|
|
27
|
+
*/
|
|
28
|
+
static existsSync(filePath: string, project: IProjectModel): boolean;
|
|
29
|
+
private static resolvePathAlias;
|
|
30
|
+
private static loadPathMappings;
|
|
31
|
+
private static matchPattern;
|
|
32
|
+
private static replacePlaceholder;
|
|
33
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import { getTsconfig } from "get-tsconfig";
|
|
4
|
+
export class ExtensionSrcResolver {
|
|
5
|
+
static pathMappings = null;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Import a module from a given file path.
|
|
9
|
+
* - If path starts with "/extensions/", it resolves from project root
|
|
10
|
+
* - If path matches tsconfig path alias (e.g., "@/*"), it resolves using tsconfig
|
|
11
|
+
* - Otherwise, treats path as absolute
|
|
12
|
+
* Returns the default export or named export matching the filename.
|
|
13
|
+
*/
|
|
14
|
+
static async importFromPath(filePath, project) {
|
|
15
|
+
const importPath = this.resolvePath(filePath, project);
|
|
16
|
+
const exportName = path.basename(filePath).replace(path.extname(filePath), "");
|
|
17
|
+
const importedModule = await import(importPath);
|
|
18
|
+
|
|
19
|
+
// Support both default and named exports.
|
|
20
|
+
// Check for 'default' property existence rather than truthiness.
|
|
21
|
+
return "default" in importedModule && importedModule.default || importedModule[exportName];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Resolve a file path to an absolute path.
|
|
26
|
+
* - If path starts with "/extensions/", it resolves from project root
|
|
27
|
+
* - If path matches tsconfig path alias (e.g., "@/*"), it resolves using tsconfig
|
|
28
|
+
* - Otherwise, treats path as absolute
|
|
29
|
+
* Returns the absolute path without importing.
|
|
30
|
+
*/
|
|
31
|
+
static resolvePath(filePath, project) {
|
|
32
|
+
if (filePath.startsWith("/extensions/")) {
|
|
33
|
+
// Resolve from project root.
|
|
34
|
+
return project.paths.rootFolder.join(filePath).toString();
|
|
35
|
+
} else {
|
|
36
|
+
// Try to resolve using tsconfig path aliases.
|
|
37
|
+
const resolved = this.resolvePathAlias(filePath, project);
|
|
38
|
+
if (resolved) {
|
|
39
|
+
return resolved;
|
|
40
|
+
} else {
|
|
41
|
+
// Treat as absolute path.
|
|
42
|
+
return filePath;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Check if a file exists at the given path.
|
|
49
|
+
* Resolves the path using the same logic as resolvePath before checking.
|
|
50
|
+
* - If path starts with "/extensions/", it resolves from project root
|
|
51
|
+
* - If path matches tsconfig path alias (e.g., "@/*"), it resolves using tsconfig
|
|
52
|
+
* - Otherwise, treats path as absolute
|
|
53
|
+
* Returns true if the file exists, false otherwise.
|
|
54
|
+
*/
|
|
55
|
+
static existsSync(filePath, project) {
|
|
56
|
+
const absolutePath = this.resolvePath(filePath, project);
|
|
57
|
+
return fs.existsSync(absolutePath);
|
|
58
|
+
}
|
|
59
|
+
static resolvePathAlias(filePath, project) {
|
|
60
|
+
const projectRoot = project.paths.rootFolder.toString();
|
|
61
|
+
|
|
62
|
+
// Load path mappings from tsconfig if not already cached.
|
|
63
|
+
if (this.pathMappings === null) {
|
|
64
|
+
this.loadPathMappings(project);
|
|
65
|
+
}
|
|
66
|
+
if (!this.pathMappings) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Try to match against each path pattern.
|
|
71
|
+
for (const [pattern, targets] of Object.entries(this.pathMappings)) {
|
|
72
|
+
const match = this.matchPattern(filePath, pattern);
|
|
73
|
+
if (match !== null) {
|
|
74
|
+
// Use the first mapping.
|
|
75
|
+
const target = targets[0];
|
|
76
|
+
const resolvedPath = this.replacePlaceholder(target, match);
|
|
77
|
+
return path.resolve(projectRoot, resolvedPath);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
static loadPathMappings(project) {
|
|
83
|
+
const tsConfigPath = project.paths.tsConfigFile.toString();
|
|
84
|
+
try {
|
|
85
|
+
// Use get-tsconfig to parse tsconfig with extends resolution.
|
|
86
|
+
const tsconfig = getTsconfig(tsConfigPath);
|
|
87
|
+
if (tsconfig?.config.compilerOptions?.paths) {
|
|
88
|
+
this.pathMappings = tsconfig.config.compilerOptions.paths;
|
|
89
|
+
} else {
|
|
90
|
+
this.pathMappings = {};
|
|
91
|
+
}
|
|
92
|
+
} catch {
|
|
93
|
+
// Ignore tsconfig parsing errors.
|
|
94
|
+
this.pathMappings = {};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
static matchPattern(importPath, pattern) {
|
|
98
|
+
// Handle wildcard patterns like "@/*" or "@extensions/*".
|
|
99
|
+
if (pattern.endsWith("/*")) {
|
|
100
|
+
const prefix = pattern.slice(0, -2);
|
|
101
|
+
// Only match if there's a slash after the prefix.
|
|
102
|
+
if (importPath.startsWith(prefix + "/")) {
|
|
103
|
+
return importPath.slice(prefix.length + 1);
|
|
104
|
+
}
|
|
105
|
+
} else if (pattern === importPath) {
|
|
106
|
+
return "";
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
static replacePlaceholder(mapping, match) {
|
|
111
|
+
// Replace wildcard with the matched part.
|
|
112
|
+
if (mapping.endsWith("/*")) {
|
|
113
|
+
return mapping.slice(0, -2) + "/" + match;
|
|
114
|
+
}
|
|
115
|
+
return mapping;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
//# sourceMappingURL=ExtensionSrcResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["path","fs","getTsconfig","ExtensionSrcResolver","pathMappings","importFromPath","filePath","project","importPath","resolvePath","exportName","basename","replace","extname","importedModule","default","startsWith","paths","rootFolder","join","toString","resolved","resolvePathAlias","existsSync","absolutePath","projectRoot","loadPathMappings","pattern","targets","Object","entries","match","matchPattern","target","resolvedPath","replacePlaceholder","resolve","tsConfigPath","tsConfigFile","tsconfig","config","compilerOptions","endsWith","prefix","slice","length","mapping"],"sources":["ExtensionSrcResolver.ts"],"sourcesContent":["import path from \"path\";\nimport fs from \"fs\";\nimport { getTsconfig } from \"get-tsconfig\";\nimport { type IProjectModel } from \"~/abstractions/models/index.js\";\n\nexport class ExtensionSrcResolver {\n private static pathMappings: { [key: string]: string[] } | null = null;\n\n /**\n * Import a module from a given file path.\n * - If path starts with \"/extensions/\", it resolves from project root\n * - If path matches tsconfig path alias (e.g., \"@/*\"), it resolves using tsconfig\n * - Otherwise, treats path as absolute\n * Returns the default export or named export matching the filename.\n */\n static async importFromPath(filePath: string, project: IProjectModel) {\n const importPath = this.resolvePath(filePath, project);\n const exportName = path.basename(filePath).replace(path.extname(filePath), \"\");\n\n const importedModule = await import(importPath);\n\n // Support both default and named exports.\n // Check for 'default' property existence rather than truthiness.\n return (\n (\"default\" in importedModule && importedModule.default) || importedModule[exportName]\n );\n }\n\n /**\n * Resolve a file path to an absolute path.\n * - If path starts with \"/extensions/\", it resolves from project root\n * - If path matches tsconfig path alias (e.g., \"@/*\"), it resolves using tsconfig\n * - Otherwise, treats path as absolute\n * Returns the absolute path without importing.\n */\n static resolvePath(filePath: string, project: IProjectModel): string {\n if (filePath.startsWith(\"/extensions/\")) {\n // Resolve from project root.\n return project.paths.rootFolder.join(filePath).toString();\n } else {\n // Try to resolve using tsconfig path aliases.\n const resolved = this.resolvePathAlias(filePath, project);\n if (resolved) {\n return resolved;\n } else {\n // Treat as absolute path.\n return filePath;\n }\n }\n }\n\n /**\n * Check if a file exists at the given path.\n * Resolves the path using the same logic as resolvePath before checking.\n * - If path starts with \"/extensions/\", it resolves from project root\n * - If path matches tsconfig path alias (e.g., \"@/*\"), it resolves using tsconfig\n * - Otherwise, treats path as absolute\n * Returns true if the file exists, false otherwise.\n */\n static existsSync(filePath: string, project: IProjectModel): boolean {\n const absolutePath = this.resolvePath(filePath, project);\n return fs.existsSync(absolutePath);\n }\n\n private static resolvePathAlias(filePath: string, project: IProjectModel): string | null {\n const projectRoot = project.paths.rootFolder.toString();\n\n // Load path mappings from tsconfig if not already cached.\n if (this.pathMappings === null) {\n this.loadPathMappings(project);\n }\n\n if (!this.pathMappings) {\n return null;\n }\n\n // Try to match against each path pattern.\n for (const [pattern, targets] of Object.entries(this.pathMappings)) {\n const match = this.matchPattern(filePath, pattern);\n if (match !== null) {\n // Use the first mapping.\n const target = targets[0];\n const resolvedPath = this.replacePlaceholder(target, match);\n return path.resolve(projectRoot, resolvedPath);\n }\n }\n\n return null;\n }\n\n private static loadPathMappings(project: IProjectModel): void {\n const tsConfigPath = project.paths.tsConfigFile.toString();\n\n try {\n // Use get-tsconfig to parse tsconfig with extends resolution.\n const tsconfig = getTsconfig(tsConfigPath);\n\n if (tsconfig?.config.compilerOptions?.paths) {\n this.pathMappings = tsconfig.config.compilerOptions.paths;\n } else {\n this.pathMappings = {};\n }\n } catch {\n // Ignore tsconfig parsing errors.\n this.pathMappings = {};\n }\n }\n\n private static matchPattern(importPath: string, pattern: string): string | null {\n // Handle wildcard patterns like \"@/*\" or \"@extensions/*\".\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -2);\n // Only match if there's a slash after the prefix.\n if (importPath.startsWith(prefix + \"/\")) {\n return importPath.slice(prefix.length + 1);\n }\n } else if (pattern === importPath) {\n return \"\";\n }\n\n return null;\n }\n\n private static replacePlaceholder(mapping: string, match: string): string {\n // Replace wildcard with the matched part.\n if (mapping.endsWith(\"/*\")) {\n return mapping.slice(0, -2) + \"/\" + match;\n }\n return mapping;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
package/utils/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export * from "./createPathResolver.js";
|
|
|
3
3
|
export * from "./getRandomColorForString.js";
|
|
4
4
|
export * from "./getStackName.js";
|
|
5
5
|
export * from "./getTemplatesFolderPath.js";
|
|
6
|
-
export * from "./
|
|
6
|
+
export * from "./ExtensionSrcResolver.js";
|
|
7
7
|
export * from "./isValidRegionName.js";
|
|
8
8
|
export * from "./isValidVariantName.js";
|
|
9
9
|
export * from "./measureDuration.js";
|
package/utils/index.js
CHANGED
|
@@ -3,7 +3,7 @@ export * from "./createPathResolver.js";
|
|
|
3
3
|
export * from "./getRandomColorForString.js";
|
|
4
4
|
export * from "./getStackName.js";
|
|
5
5
|
export * from "./getTemplatesFolderPath.js";
|
|
6
|
-
export * from "./
|
|
6
|
+
export * from "./ExtensionSrcResolver.js";
|
|
7
7
|
export * from "./isValidRegionName.js";
|
|
8
8
|
export * from "./isValidVariantName.js";
|
|
9
9
|
export * from "./measureDuration.js";
|
package/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./constants.js\";\nexport * from \"./createPathResolver.js\";\nexport * from \"./getRandomColorForString.js\";\nexport * from \"./getStackName.js\";\nexport * from \"./getTemplatesFolderPath.js\";\nexport * from \"./
|
|
1
|
+
{"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./constants.js\";\nexport * from \"./createPathResolver.js\";\nexport * from \"./getRandomColorForString.js\";\nexport * from \"./getStackName.js\";\nexport * from \"./getTemplatesFolderPath.js\";\nexport * from \"./ExtensionSrcResolver.js\";\nexport * from \"./isValidRegionName.js\";\nexport * from \"./isValidVariantName.js\";\nexport * from \"./measureDuration.js\";\nexport * from \"./requireConfig.js\";\nexport * from \"./projectSdkContext.js\";\nexport * from \"./registerExtension.js\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","ignoreList":[]}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { Abstraction } from "@webiny/di";
|
|
3
|
-
export type DefineApiExtensionParams = {
|
|
4
|
-
type: string;
|
|
5
|
-
description?: string;
|
|
6
|
-
abstraction?: Abstraction<any>;
|
|
7
|
-
};
|
|
8
|
-
export declare const defineApiExtension: (params: DefineApiExtensionParams) => import("~/defineExtension/index.js").ExtensionComponent<z.ZodObject<{
|
|
9
|
-
src: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
|
|
10
|
-
exportName: z.ZodOptional<z.ZodString>;
|
|
11
|
-
}, "strip", z.ZodTypeAny, {
|
|
12
|
-
src: string;
|
|
13
|
-
exportName?: string | undefined;
|
|
14
|
-
}, {
|
|
15
|
-
src: string;
|
|
16
|
-
exportName?: string | undefined;
|
|
17
|
-
}>>;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["z","Node","Project","defineExtension","zodSrcPath","path","crypto","defineApiExtension","params","type","tags","runtimeContext","appName","description","multiple","paramsSchema","project","object","src","abstraction","exportName","string","optional","build","ctx","extensionsTsFilePath","paths","workspaceFolder","join","toString","extensionFilePath","absoluteExtensionFilePath","startsWith","rootFolder","extensionFileName","basename","parse","name","hash","createHash","update","digest","exportNameAlias","slice","importPath","relative","dirname","replace","addSourceFileAtPath","source","getSourceFileOrThrow","existingImportDeclaration","getImportDeclaration","index","importDeclarations","getImportDeclarations","length","last","getChildIndex","extensionProject","extensionSource","hasDefaultExport","getDefaultExportSymbol","undefined","insertImportDeclaration","defaultImport","moduleSpecifier","namedImports","alias","pluginsArray","getFirstDescendant","node","isArrayLiteralExpression","addElement","contextPluginImportPath","existingContextPluginImport","save"],"sources":["defineApiExtension.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { Node, Project, ArrayLiteralExpression } from \"ts-morph\";\nimport { Abstraction } from \"@webiny/di\";\nimport { defineExtension } from \"~/defineExtension/index.js\";\nimport { zodSrcPath } from \"~/defineExtension/zodTypes/zodSrcPath.js\";\nimport path from \"path\";\nimport crypto from \"crypto\";\n\nexport type DefineApiExtensionParams = {\n type: string;\n description?: string;\n abstraction?: Abstraction<any>;\n};\n\nexport const defineApiExtension = (params: DefineApiExtensionParams) =>\n defineExtension({\n type: params.type,\n tags: { runtimeContext: \"app-build\", appName: \"api\" },\n description: params.description,\n multiple: true,\n paramsSchema: ({ project }) => {\n return z.object({\n src: zodSrcPath({ project, abstraction: params.abstraction }),\n exportName: z.string().optional()\n });\n },\n async build(params, ctx) {\n const extensionsTsFilePath = ctx.project.paths.workspaceFolder\n .join(\"apps\", \"api\", \"graphql\", \"src\", \"extensions.ts\")\n .toString();\n\n const { src: extensionFilePath } = params;\n\n // Resolve to absolute path for file operations\n let absoluteExtensionFilePath: string;\n if (extensionFilePath.startsWith(\"/extensions/\")) {\n // Resolve from project root\n absoluteExtensionFilePath = ctx.project.paths.rootFolder\n .join(extensionFilePath)\n .toString();\n } else {\n // Treat as absolute path\n absoluteExtensionFilePath = extensionFilePath;\n }\n\n const extensionFileName = path.basename(absoluteExtensionFilePath);\n\n // 1. Export name is always the file name without extension.\n const exportName = params.exportName ?? path.parse(extensionFileName).name;\n\n // 2. Alias name is \"ApiExtension_\" + hash of the file path. This way we\n // avoid potential naming conflicts and keep the identifier constant.\n const hash = crypto.createHash(\"sha256\").update(extensionFilePath).digest(\"hex\");\n const exportNameAlias = `ApiExtension_${hash.slice(-10)}`;\n\n // 3. Calculate import path relative to `extensions.ts` file.\n const importPath = path\n .relative(path.dirname(extensionsTsFilePath), absoluteExtensionFilePath)\n .replace(/\\.tsx?$/, \".js\");\n\n const project = new Project();\n project.addSourceFileAtPath(extensionsTsFilePath);\n\n const source = project.getSourceFileOrThrow(extensionsTsFilePath);\n\n const existingImportDeclaration = source.getImportDeclaration(importPath);\n if (existingImportDeclaration) {\n return;\n }\n\n let index = 1;\n\n const importDeclarations = source.getImportDeclarations();\n if (importDeclarations.length) {\n const last = importDeclarations[importDeclarations.length - 1];\n index = last.getChildIndex() + 1;\n }\n\n // Check if the file has a default export using AST parsing.\n const extensionProject = new Project();\n extensionProject.addSourceFileAtPath(absoluteExtensionFilePath);\n const extensionSource =\n extensionProject.getSourceFileOrThrow(absoluteExtensionFilePath);\n const hasDefaultExport = extensionSource.getDefaultExportSymbol() !== undefined;\n\n // Support both default and named exports.\n if (hasDefaultExport) {\n source.insertImportDeclaration(index, {\n defaultImport: exportNameAlias,\n moduleSpecifier: importPath\n });\n } else {\n source.insertImportDeclaration(index, {\n namedImports: [{ name: exportName, alias: exportNameAlias }],\n moduleSpecifier: importPath\n });\n }\n\n const pluginsArray = source.getFirstDescendant(node =>\n Node.isArrayLiteralExpression(node)\n ) as ArrayLiteralExpression;\n\n pluginsArray.addElement(\n `\\ncreateContextPlugin(ctx => {\\n\\tregisterExtension(ctx.container, ${exportNameAlias});\\n})`\n );\n\n {\n let index = 1;\n\n const importDeclarations = source.getImportDeclarations();\n if (importDeclarations.length) {\n const last = importDeclarations[importDeclarations.length - 1];\n index = last.getChildIndex() + 1;\n }\n\n const contextPluginImportPath = \"@webiny/api/plugins/ContextPlugin\";\n const existingContextPluginImport =\n source.getImportDeclaration(contextPluginImportPath);\n if (!existingContextPluginImport) {\n source.insertImportDeclaration(index, {\n namedImports: [\"createContextPlugin\"],\n moduleSpecifier: contextPluginImportPath\n });\n }\n }\n\n await source.save();\n }\n });\n"],"mappings":"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","ignoreList":[]}
|
package/exports/extensions.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { EnvVar } from "../extensions/EnvVar.js";
|
package/exports/extensions.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["EnvVar"],"sources":["extensions.ts"],"sourcesContent":["export { EnvVar } from \"~/extensions/EnvVar.js\";\n"],"mappings":"AAAA,SAASA,MAAM","ignoreList":[]}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { type IProjectModel } from "../abstractions/models/index.js";
|
|
2
|
-
export declare class ImplPathResolver {
|
|
3
|
-
/**
|
|
4
|
-
* Import a module from a given file path.
|
|
5
|
-
* - If path starts with "/extensions/", it resolves from project root
|
|
6
|
-
* - Otherwise, treats path as absolute
|
|
7
|
-
* Returns the default export or named export matching the filename.
|
|
8
|
-
*/
|
|
9
|
-
static importFromPath(filePath: string, project: IProjectModel): Promise<any>;
|
|
10
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import path from "path";
|
|
2
|
-
export class ImplPathResolver {
|
|
3
|
-
/**
|
|
4
|
-
* Import a module from a given file path.
|
|
5
|
-
* - If path starts with "/extensions/", it resolves from project root
|
|
6
|
-
* - Otherwise, treats path as absolute
|
|
7
|
-
* Returns the default export or named export matching the filename.
|
|
8
|
-
*/
|
|
9
|
-
static async importFromPath(filePath, project) {
|
|
10
|
-
let importPath;
|
|
11
|
-
if (filePath.startsWith("/extensions/")) {
|
|
12
|
-
// Resolve from project root.
|
|
13
|
-
importPath = project.paths.rootFolder.join(filePath).toString();
|
|
14
|
-
} else {
|
|
15
|
-
// Treat as absolute path.
|
|
16
|
-
importPath = filePath;
|
|
17
|
-
}
|
|
18
|
-
const exportName = path.basename(filePath).replace(path.extname(filePath), "");
|
|
19
|
-
const importedModule = await import(importPath);
|
|
20
|
-
|
|
21
|
-
// Support both default and named exports.
|
|
22
|
-
// Check for 'default' property existence rather than truthiness.
|
|
23
|
-
return "default" in importedModule && importedModule.default || importedModule[exportName];
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
//# sourceMappingURL=ImplPathResolver.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["path","ImplPathResolver","importFromPath","filePath","project","importPath","startsWith","paths","rootFolder","join","toString","exportName","basename","replace","extname","importedModule","default"],"sources":["ImplPathResolver.ts"],"sourcesContent":["import path from \"path\";\nimport { type IProjectModel } from \"~/abstractions/models/index.js\";\n\nexport class ImplPathResolver {\n /**\n * Import a module from a given file path.\n * - If path starts with \"/extensions/\", it resolves from project root\n * - Otherwise, treats path as absolute\n * Returns the default export or named export matching the filename.\n */\n static async importFromPath(filePath: string, project: IProjectModel) {\n let importPath: string;\n if (filePath.startsWith(\"/extensions/\")) {\n // Resolve from project root.\n importPath = project.paths.rootFolder.join(filePath).toString();\n } else {\n // Treat as absolute path.\n importPath = filePath;\n }\n\n const exportName = path.basename(filePath).replace(path.extname(filePath), \"\");\n\n const importedModule = await import(importPath);\n\n // Support both default and named exports.\n // Check for 'default' property existence rather than truthiness.\n return (\n (\"default\" in importedModule && importedModule.default) || importedModule[exportName]\n );\n }\n}\n"],"mappings":"AAAA,OAAOA,IAAI,MAAM,MAAM;AAGvB,OAAO,MAAMC,gBAAgB,CAAC;EAC1B;AACJ;AACA;AACA;AACA;AACA;EACI,aAAaC,cAAcA,CAACC,QAAgB,EAAEC,OAAsB,EAAE;IAClE,IAAIC,UAAkB;IACtB,IAAIF,QAAQ,CAACG,UAAU,CAAC,cAAc,CAAC,EAAE;MACrC;MACAD,UAAU,GAAGD,OAAO,CAACG,KAAK,CAACC,UAAU,CAACC,IAAI,CAACN,QAAQ,CAAC,CAACO,QAAQ,CAAC,CAAC;IACnE,CAAC,MAAM;MACH;MACAL,UAAU,GAAGF,QAAQ;IACzB;IAEA,MAAMQ,UAAU,GAAGX,IAAI,CAACY,QAAQ,CAACT,QAAQ,CAAC,CAACU,OAAO,CAACb,IAAI,CAACc,OAAO,CAACX,QAAQ,CAAC,EAAE,EAAE,CAAC;IAE9E,MAAMY,cAAc,GAAG,MAAM,MAAM,CAACV,UAAU,CAAC;;IAE/C;IACA;IACA,OACK,SAAS,IAAIU,cAAc,IAAIA,cAAc,CAACC,OAAO,IAAKD,cAAc,CAACJ,UAAU,CAAC;EAE7F;AACJ","ignoreList":[]}
|