@pptb/validate 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const validate_1 = require("./validate");
40
+ async function main() {
41
+ const cwd = process.cwd();
42
+ const packageJsonPath = path.join(cwd, "package.json");
43
+ if (!fs.existsSync(packageJsonPath)) {
44
+ console.error("❌ No package.json found in current directory");
45
+ process.exit(1);
46
+ }
47
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
48
+ const packageResult = await (0, validate_1.validatePackageJson)(packageJson, { skipUrlChecks: false });
49
+ console.log("\n📦 package.json validation");
50
+ printResult(packageResult);
51
+ const pptbConfigPath = path.join(cwd, "pptb.config.json");
52
+ if (fs.existsSync(pptbConfigPath)) {
53
+ const pptbConfig = JSON.parse(fs.readFileSync(pptbConfigPath, "utf-8"));
54
+ const configResult = (0, validate_1.validatePPTBConfig)(pptbConfig);
55
+ console.log("\n⚙️ pptb.config.json validation");
56
+ printResult(configResult);
57
+ if (!configResult.valid)
58
+ process.exit(1);
59
+ }
60
+ else {
61
+ console.log("\nℹ️ No pptb.config.json found (optional)");
62
+ }
63
+ if (!packageResult.valid)
64
+ process.exit(1);
65
+ }
66
+ function printResult(result) {
67
+ if (result.errors.length === 0 && result.warnings.length === 0) {
68
+ console.log(" ✅ All checks passed");
69
+ return;
70
+ }
71
+ result.errors.forEach((e) => console.error(` ❌ ${e}`));
72
+ result.warnings.forEach((w) => console.warn(` ⚠️ ${w}`));
73
+ if (result.valid)
74
+ console.log(" ✅ Valid (with warnings)");
75
+ }
76
+ main().catch((err) => {
77
+ console.error("Unexpected error:", err);
78
+ process.exit(1);
79
+ });
80
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,uCAAyB;AACzB,2CAA6B;AAC7B,yCAAqE;AAErE,KAAK,UAAU,IAAI;IACf,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,MAAM,aAAa,GAAG,MAAM,IAAA,8BAAmB,EAAC,WAAW,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;IAEvF,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,WAAW,CAAC,aAAa,CAAC,CAAC;IAE3B,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;QACxE,MAAM,YAAY,GAAG,IAAA,6BAAkB,EAAC,UAAU,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,WAAW,CAAC,YAAY,CAAC,CAAC;QAE1B,IAAI,CAAC,YAAY,CAAC,KAAK;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,KAAK;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,WAAW,CAAC,MAAgE;IACjF,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO;IACX,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3D,IAAI,MAAM,CAAC,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAC/D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACjB,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { APPROVED_LICENSES, isValidUrl, KNOWN_CAPABILITY_TAGS, VALID_MULTI_CONNECTION_VALUES, validatePackageJson, validatePPTBConfig } from "./validate";
2
+ export type { Configurations, Contributor, CspExceptions, Features, InvocationConfig, PPTBConfig, ToolPackageJson, ValidatePackageJsonOptions, ValidationResult } from "./validate";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE1J,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,eAAe,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validatePPTBConfig = exports.validatePackageJson = exports.VALID_MULTI_CONNECTION_VALUES = exports.KNOWN_CAPABILITY_TAGS = exports.isValidUrl = exports.APPROVED_LICENSES = void 0;
4
+ // Public API — validation only.
5
+ // npm.ts is intentionally not re-exported here; import it directly when needed.
6
+ var validate_1 = require("./validate");
7
+ Object.defineProperty(exports, "APPROVED_LICENSES", { enumerable: true, get: function () { return validate_1.APPROVED_LICENSES; } });
8
+ Object.defineProperty(exports, "isValidUrl", { enumerable: true, get: function () { return validate_1.isValidUrl; } });
9
+ Object.defineProperty(exports, "KNOWN_CAPABILITY_TAGS", { enumerable: true, get: function () { return validate_1.KNOWN_CAPABILITY_TAGS; } });
10
+ Object.defineProperty(exports, "VALID_MULTI_CONNECTION_VALUES", { enumerable: true, get: function () { return validate_1.VALID_MULTI_CONNECTION_VALUES; } });
11
+ Object.defineProperty(exports, "validatePackageJson", { enumerable: true, get: function () { return validate_1.validatePackageJson; } });
12
+ Object.defineProperty(exports, "validatePPTBConfig", { enumerable: true, get: function () { return validate_1.validatePPTBConfig; } });
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,gCAAgC;AAChC,gFAAgF;AAChF,uCAA0J;AAAjJ,6GAAA,iBAAiB,OAAA;AAAE,sGAAA,UAAU,OAAA;AAAE,iHAAA,qBAAqB,OAAA;AAAE,yHAAA,6BAA6B,OAAA;AAAE,+GAAA,mBAAmB,OAAA;AAAE,8GAAA,kBAAkB,OAAA"}
package/dist/npm.d.ts ADDED
@@ -0,0 +1,42 @@
1
+ export interface NpmPackageInfo {
2
+ name: string;
3
+ version: string;
4
+ description?: string;
5
+ license?: string;
6
+ displayName?: string;
7
+ }
8
+ interface NpmRegistryVersionData {
9
+ name: string;
10
+ version: string;
11
+ description?: string;
12
+ license?: string;
13
+ displayName?: string;
14
+ dist: {
15
+ tarball: string;
16
+ };
17
+ }
18
+ export declare function fetchNpmPackageMetadata(packageName: string): Promise<{
19
+ success: true;
20
+ data: {
21
+ versionData: NpmRegistryVersionData;
22
+ latestVersion: string;
23
+ tarballUrl: string;
24
+ };
25
+ } | {
26
+ success: false;
27
+ error: string;
28
+ }>;
29
+ export interface PackageStructureCheck {
30
+ hasNpmShrinkwrap: boolean;
31
+ hasDistFolder: boolean;
32
+ hasDistIndexHtml: boolean;
33
+ }
34
+ export declare function validatePackageStructure(packageName: string): Promise<{
35
+ success: true;
36
+ data: PackageStructureCheck;
37
+ } | {
38
+ success: false;
39
+ error: string;
40
+ }>;
41
+ export {};
42
+ //# sourceMappingURL=npm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm.d.ts","sourceRoot":"","sources":["../src/npm.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,sBAAsB;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7B;AAED,wBAAsB,uBAAuB,CACzC,WAAW,EAAE,MAAM,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE;QAAE,WAAW,EAAE,sBAAsB,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA0B1J;AAED,MAAM,WAAW,qBAAqB;IAClC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAsB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,qBAAqB,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA2C/J"}
package/dist/npm.js ADDED
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ // Node-only helpers — npm registry + tarball inspection.
3
+ // Not imported by validate.ts so web consumers that only need validation
4
+ // don't pull in Node-specific modules.
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.fetchNpmPackageMetadata = fetchNpmPackageMetadata;
40
+ exports.validatePackageStructure = validatePackageStructure;
41
+ const fs = __importStar(require("fs"));
42
+ const os = __importStar(require("os"));
43
+ const path = __importStar(require("path"));
44
+ const tar = __importStar(require("tar"));
45
+ async function fetchNpmPackageMetadata(packageName) {
46
+ try {
47
+ const response = await fetch(`https://registry.npmjs.org/${encodeURIComponent(packageName)}`, { headers: { Accept: "application/json" } });
48
+ if (!response.ok) {
49
+ return response.status === 404 ? { success: false, error: `Package "${packageName}" not found on npm` } : { success: false, error: `Failed to fetch package: HTTP ${response.status}` };
50
+ }
51
+ const packageData = await response.json();
52
+ const latestVersion = packageData["dist-tags"]?.latest;
53
+ if (!latestVersion) {
54
+ return { success: false, error: `Package "${packageName}" has no latest version` };
55
+ }
56
+ const versionData = packageData.versions?.[latestVersion];
57
+ if (!versionData) {
58
+ return { success: false, error: `Could not find version data for ${latestVersion}` };
59
+ }
60
+ const tarballUrl = versionData.dist?.tarball;
61
+ if (!tarballUrl) {
62
+ return { success: false, error: "Could not find tarball URL" };
63
+ }
64
+ return { success: true, data: { versionData, latestVersion, tarballUrl } };
65
+ }
66
+ catch (error) {
67
+ return {
68
+ success: false,
69
+ error: error instanceof Error ? error.message : "Unknown error fetching package metadata",
70
+ };
71
+ }
72
+ }
73
+ async function validatePackageStructure(packageName) {
74
+ const metadataResult = await fetchNpmPackageMetadata(packageName);
75
+ if (!metadataResult.success)
76
+ return metadataResult;
77
+ const tarballResponse = await fetch(metadataResult.data.tarballUrl);
78
+ if (!tarballResponse.ok) {
79
+ return { success: false, error: `Failed to download tarball: HTTP ${tarballResponse.status}` };
80
+ }
81
+ const tarballBuffer = await tarballResponse.arrayBuffer();
82
+ const tmpDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), "pptb-validate-"));
83
+ try {
84
+ const tarballPath = path.join(tmpDir, "package.tgz");
85
+ await fs.promises.writeFile(tarballPath, Buffer.from(tarballBuffer));
86
+ const extractDir = path.join(tmpDir, "extracted");
87
+ await fs.promises.mkdir(extractDir, { recursive: true });
88
+ await tar.x({ file: tarballPath, cwd: extractDir });
89
+ const packageDir = path.join(extractDir, "package");
90
+ const check = async (p, isDir = false) => {
91
+ try {
92
+ const stat = await fs.promises.stat(p);
93
+ return isDir ? stat.isDirectory() : stat.isFile();
94
+ }
95
+ catch {
96
+ return false;
97
+ }
98
+ };
99
+ const hasDistFolder = await check(path.join(packageDir, "dist"), true);
100
+ return {
101
+ success: true,
102
+ data: {
103
+ hasNpmShrinkwrap: await check(path.join(packageDir, "npm-shrinkwrap.json")),
104
+ hasDistFolder,
105
+ hasDistIndexHtml: hasDistFolder ? await check(path.join(packageDir, "dist", "index.html")) : false,
106
+ },
107
+ };
108
+ }
109
+ finally {
110
+ await fs.promises.rm(tmpDir, { recursive: true, force: true });
111
+ }
112
+ }
113
+ //# sourceMappingURL=npm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm.js","sourceRoot":"","sources":["../src/npm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ export interface Contributor {
2
+ name: string;
3
+ url?: string;
4
+ }
5
+ export interface CspExceptions {
6
+ "connect-src"?: string[];
7
+ "script-src"?: string[];
8
+ "style-src"?: string[];
9
+ "img-src"?: string[];
10
+ "font-src"?: string[];
11
+ "frame-src"?: string[];
12
+ "media-src"?: string[];
13
+ }
14
+ export interface Configurations {
15
+ repository?: string;
16
+ website?: string;
17
+ funding?: string;
18
+ readmeUrl?: string;
19
+ }
20
+ export interface Features {
21
+ multiConnection?: "required" | "optional" | "none";
22
+ minAPI?: string;
23
+ }
24
+ export interface ToolPackageJson {
25
+ name: string;
26
+ version: string;
27
+ displayName?: string;
28
+ description?: string;
29
+ contributors?: Contributor[];
30
+ cspExceptions?: CspExceptions;
31
+ license?: string;
32
+ icon?: string;
33
+ configurations?: Configurations;
34
+ features?: Features;
35
+ }
36
+ export interface ValidationResult {
37
+ valid: boolean;
38
+ errors: string[];
39
+ warnings: string[];
40
+ packageInfo?: object;
41
+ }
42
+ export interface ValidatePackageJsonOptions {
43
+ skipUrlChecks?: boolean;
44
+ }
45
+ export type JsonSchemaProperty = {
46
+ type?: string;
47
+ enum?: string[];
48
+ items?: object;
49
+ };
50
+ export type JsonSchemaObject = {
51
+ properties?: Record<string, JsonSchemaProperty>;
52
+ };
53
+ export interface InvocationConfig {
54
+ version: string;
55
+ prefill?: JsonSchemaObject;
56
+ returnTopic?: JsonSchemaObject;
57
+ capabilities?: string[];
58
+ }
59
+ export interface PPTBConfig {
60
+ invocation?: InvocationConfig;
61
+ }
62
+ export declare const APPROVED_LICENSES: string[];
63
+ export declare const VALID_MULTI_CONNECTION_VALUES: readonly ["required", "optional", "none"];
64
+ /**
65
+ * Keep in sync with BUILT_IN_CAPABILITY_TAGS in
66
+ * src/main/managers/toolRegistryManager.ts in the desktop app.
67
+ */
68
+ export declare const KNOWN_CAPABILITY_TAGS: string[];
69
+ export declare function isValidUrl(url: string): boolean;
70
+ export declare function validatePackageJson(packageJson: ToolPackageJson, options?: ValidatePackageJsonOptions): Promise<ValidationResult>;
71
+ export declare function validatePPTBConfig(config: PPTBConfig): ValidationResult;
72
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC1B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACrB,eAAe,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CACnD,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACvB,UAAU,CAAC,EAAE,gBAAgB,CAAC;CACjC;AAMD,eAAO,MAAM,iBAAiB,UAAkH,CAAC;AAEjJ,eAAO,MAAM,6BAA6B,2CAA4C,CAAC;AAEvF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,UAAyI,CAAC;AAkB5K,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO/C;AA6ED,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,eAAe,EAAE,OAAO,GAAE,0BAA+B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0K3I;AAMD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,gBAAgB,CAuEvE"}
@@ -0,0 +1,362 @@
1
+ "use strict";
2
+ // @pptb/validate — core validation logic
3
+ // Single source of truth for both the pptb-validate CLI and the web intake platform.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.KNOWN_CAPABILITY_TAGS = exports.VALID_MULTI_CONNECTION_VALUES = exports.APPROVED_LICENSES = void 0;
6
+ exports.isValidUrl = isValidUrl;
7
+ exports.validatePackageJson = validatePackageJson;
8
+ exports.validatePPTBConfig = validatePPTBConfig;
9
+ // ---------------------------------------------------------------------------
10
+ // Constants
11
+ // ---------------------------------------------------------------------------
12
+ exports.APPROVED_LICENSES = ["MIT", "Apache-2.0", "BSD-2-Clause", "BSD-3-Clause", "GPL-2.0", "GPL-3.0", "LGPL-3.0", "ISC", "AGPL-3.0-only"];
13
+ exports.VALID_MULTI_CONNECTION_VALUES = ["required", "optional", "none"];
14
+ /**
15
+ * Keep in sync with BUILT_IN_CAPABILITY_TAGS in
16
+ * src/main/managers/toolRegistryManager.ts in the desktop app.
17
+ */
18
+ exports.KNOWN_CAPABILITY_TAGS = ["fetchxml", "entity-picker", "record-selector", "solution-selector", "webresource-editor", "plugin-inspector", "pcf-control-builder"];
19
+ const SEMVER_REGEX = /^\d+\.\d+\.\d+(-[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/;
20
+ const VALID_CSP_DIRECTIVES = [
21
+ "connect-src",
22
+ "script-src",
23
+ "style-src",
24
+ "img-src",
25
+ "font-src",
26
+ "frame-src",
27
+ "media-src", // present in CLI package, was missing from web
28
+ ];
29
+ // ---------------------------------------------------------------------------
30
+ // Helpers
31
+ // ---------------------------------------------------------------------------
32
+ function isValidUrl(url) {
33
+ try {
34
+ new URL(url);
35
+ return true;
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ function isGithubDomain(url) {
42
+ try {
43
+ const hostname = new URL(url).hostname.toLowerCase();
44
+ return hostname === "github.com" || hostname.endsWith(".github.com");
45
+ }
46
+ catch {
47
+ return false;
48
+ }
49
+ }
50
+ function validateIconPath(fieldName, iconPath, errors) {
51
+ if (iconPath.startsWith("http://") || iconPath.startsWith("https://")) {
52
+ errors.push(`${fieldName} cannot be an HTTP(S) URL - icons must be bundled under dist`);
53
+ return;
54
+ }
55
+ if (iconPath.startsWith("/")) {
56
+ errors.push(`${fieldName} must be a relative path (e.g., 'icon.svg' or 'icons/icon.svg')`);
57
+ return;
58
+ }
59
+ // Windows absolute paths — present in CLI package, was missing from web
60
+ if (/^[a-zA-Z]:/.test(iconPath)) {
61
+ errors.push(`${fieldName} must be a relative path (e.g., 'icon.svg' or 'icons/icon.svg')`);
62
+ return;
63
+ }
64
+ // Backslashes — present in CLI package, was missing from web
65
+ if (iconPath.includes("\\")) {
66
+ errors.push(`${fieldName} must use forward slashes, not backslashes (e.g., 'icons/icon.svg')`);
67
+ return;
68
+ }
69
+ if (iconPath.includes("..")) {
70
+ errors.push(`${fieldName} cannot contain '..' (path traversal not allowed)`);
71
+ return;
72
+ }
73
+ if (!iconPath.toLowerCase().endsWith(".svg")) {
74
+ errors.push(`${fieldName} must be an SVG file with .svg extension`);
75
+ }
76
+ }
77
+ async function isUrlAccessible(url) {
78
+ try {
79
+ const response = await fetch(url, { method: "HEAD", redirect: "follow" });
80
+ return response.ok;
81
+ }
82
+ catch {
83
+ return false;
84
+ }
85
+ }
86
+ function validateJsonSchemaProperties(fieldName, properties, errors) {
87
+ if (properties === null || typeof properties !== "object" || Array.isArray(properties)) {
88
+ errors.push(`${fieldName}.properties must be a non-array object`);
89
+ return;
90
+ }
91
+ for (const [key, value] of Object.entries(properties)) {
92
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
93
+ errors.push(`${fieldName}.properties.${key} must be an object`);
94
+ continue;
95
+ }
96
+ const prop = value;
97
+ if (prop.type !== undefined && typeof prop.type !== "string") {
98
+ errors.push(`${fieldName}.properties.${key}.type must be a string`);
99
+ }
100
+ if (prop.enum !== undefined) {
101
+ if (!Array.isArray(prop.enum)) {
102
+ errors.push(`${fieldName}.properties.${key}.enum must be an array`);
103
+ }
104
+ else if (prop.enum.length === 0) {
105
+ errors.push(`${fieldName}.properties.${key}.enum must not be empty`);
106
+ }
107
+ }
108
+ }
109
+ }
110
+ // ---------------------------------------------------------------------------
111
+ // validatePackageJson
112
+ // ---------------------------------------------------------------------------
113
+ async function validatePackageJson(packageJson, options = {}) {
114
+ const { skipUrlChecks = false } = options;
115
+ const errors = [];
116
+ const warnings = [];
117
+ if (!packageJson.name || typeof packageJson.name !== "string") {
118
+ errors.push("Package name is required and must be a string");
119
+ }
120
+ if (!packageJson.version || typeof packageJson.version !== "string") {
121
+ errors.push("Package version is required and must be a string");
122
+ }
123
+ if (!packageJson.displayName || typeof packageJson.displayName !== "string") {
124
+ errors.push("displayName is required and must be a string");
125
+ }
126
+ if (!packageJson.description || typeof packageJson.description !== "string") {
127
+ errors.push("description is required and must be a string");
128
+ }
129
+ // License
130
+ if (!packageJson.license) {
131
+ errors.push("license is required");
132
+ }
133
+ else if (!exports.APPROVED_LICENSES.includes(packageJson.license)) {
134
+ errors.push(`License "${packageJson.license}" is not in the approved list. Approved licenses: ${exports.APPROVED_LICENSES.join(", ")}`);
135
+ }
136
+ // Icon — warn when absent (present in CLI package, was missing from web)
137
+ if (packageJson.icon === undefined || packageJson.icon === null) {
138
+ warnings.push("icon is not set; consider adding a bundled SVG icon so your tool displays properly in the marketplace");
139
+ }
140
+ else if (typeof packageJson.icon !== "string") {
141
+ errors.push("icon must be a string (relative path to bundled SVG under dist)");
142
+ }
143
+ else {
144
+ validateIconPath("icon", packageJson.icon, errors);
145
+ }
146
+ // Contributors
147
+ if (!packageJson.contributors || !Array.isArray(packageJson.contributors)) {
148
+ errors.push("contributors is required and must be an array");
149
+ }
150
+ else if (packageJson.contributors.length === 0) {
151
+ errors.push("At least one contributor is required");
152
+ }
153
+ else {
154
+ packageJson.contributors.forEach((contributor, index) => {
155
+ if (!contributor.name || typeof contributor.name !== "string") {
156
+ errors.push(`Contributor at index ${index} must have a name`);
157
+ }
158
+ if (contributor.url && !isValidUrl(contributor.url)) {
159
+ warnings.push(`Contributor "${contributor.name}" has an invalid URL`);
160
+ }
161
+ });
162
+ }
163
+ // Configurations
164
+ if (!packageJson.configurations || typeof packageJson.configurations !== "object") {
165
+ errors.push("configurations is required and must include repository and readmeUrl");
166
+ }
167
+ else {
168
+ const configs = packageJson.configurations;
169
+ if (configs.iconUrl !== undefined) {
170
+ errors.push("configurations.iconUrl is no longer supported; use top-level 'icon' for bundled SVG path");
171
+ }
172
+ if (!configs.repository || typeof configs.repository !== "string") {
173
+ errors.push("configurations.repository is required and must be a URL");
174
+ }
175
+ else if (!isValidUrl(configs.repository)) {
176
+ errors.push("configurations.repository has an invalid URL format");
177
+ }
178
+ else if (!skipUrlChecks) {
179
+ if (!(await isUrlAccessible(configs.repository))) {
180
+ errors.push("configurations.repository URL is not accessible");
181
+ }
182
+ }
183
+ if (!configs.website) {
184
+ warnings.push("configurations.website is not set; consider adding a URL where users can learn more about your tool");
185
+ }
186
+ else if (!isValidUrl(configs.website)) {
187
+ warnings.push("configurations.website has an invalid URL format");
188
+ }
189
+ else if (!skipUrlChecks) {
190
+ if (!(await isUrlAccessible(configs.website))) {
191
+ warnings.push("configurations.website URL is not accessible");
192
+ }
193
+ }
194
+ if (configs.funding) {
195
+ if (!isValidUrl(configs.funding)) {
196
+ warnings.push("configurations.funding has an invalid URL format");
197
+ }
198
+ else if (!skipUrlChecks) {
199
+ if (!(await isUrlAccessible(configs.funding))) {
200
+ warnings.push("configurations.funding URL is not accessible");
201
+ }
202
+ }
203
+ }
204
+ if (!configs.readmeUrl || typeof configs.readmeUrl !== "string") {
205
+ errors.push("configurations.readmeUrl is required and must be a URL");
206
+ }
207
+ else if (!isValidUrl(configs.readmeUrl)) {
208
+ errors.push("configurations.readmeUrl has an invalid URL format");
209
+ }
210
+ else if (isGithubDomain(configs.readmeUrl)) {
211
+ errors.push("configurations.readmeUrl cannot be hosted on github.com; use raw.githubusercontent.com or another domain");
212
+ }
213
+ else if (!skipUrlChecks) {
214
+ if (!(await isUrlAccessible(configs.readmeUrl))) {
215
+ errors.push("configurations.readmeUrl is not accessible");
216
+ }
217
+ }
218
+ }
219
+ // CSP exceptions
220
+ if (packageJson.cspExceptions) {
221
+ const csp = packageJson.cspExceptions;
222
+ if (typeof csp !== "object" || csp === null || Array.isArray(csp)) {
223
+ errors.push("cspExceptions must be an object mapping CSP directives to arrays of strings");
224
+ }
225
+ else {
226
+ if (Object.keys(csp).length === 0) {
227
+ errors.push("cspExceptions cannot be empty. If CSP exceptions are not needed, remove the cspExceptions field");
228
+ }
229
+ for (const directive of Object.keys(csp)) {
230
+ if (!VALID_CSP_DIRECTIVES.includes(directive)) {
231
+ warnings.push(`Unknown CSP directive: ${directive}`);
232
+ }
233
+ const values = csp[directive];
234
+ if (values && !Array.isArray(values)) {
235
+ errors.push(`CSP directive "${directive}" must be an array of strings`);
236
+ }
237
+ else if (values && values.length === 0) {
238
+ errors.push(`CSP directive "${directive}" cannot be an empty array`);
239
+ }
240
+ }
241
+ }
242
+ }
243
+ // Features
244
+ if (packageJson.features !== undefined) {
245
+ const features = packageJson.features;
246
+ if (features === null || typeof features !== "object" || Array.isArray(features)) {
247
+ errors.push("features must be a non-array object with optional 'multiConnection' and 'minAPI' properties");
248
+ }
249
+ else {
250
+ const VALID_FEATURE_KEYS = ["multiConnection", "minAPI"];
251
+ const invalidKeys = Object.keys(features).filter((k) => !VALID_FEATURE_KEYS.includes(k));
252
+ if (invalidKeys.length > 0) {
253
+ errors.push(`features can only contain ${VALID_FEATURE_KEYS.map((k) => `'${k}'`).join(", ")} properties. Invalid properties: ${invalidKeys.join(", ")}`);
254
+ }
255
+ if (features.multiConnection === undefined) {
256
+ errors.push("features.multiConnection is required when features object is provided");
257
+ }
258
+ else if (!exports.VALID_MULTI_CONNECTION_VALUES.includes(features.multiConnection)) {
259
+ errors.push(`features.multiConnection must be one of: ${exports.VALID_MULTI_CONNECTION_VALUES.join(", ")}`);
260
+ }
261
+ if (features.minAPI !== undefined) {
262
+ if (typeof features.minAPI !== "string" || !SEMVER_REGEX.test(features.minAPI)) {
263
+ errors.push("features.minAPI must be a valid semantic version string (e.g., '1.0.0')");
264
+ }
265
+ }
266
+ }
267
+ }
268
+ const valid = errors.length === 0;
269
+ return {
270
+ valid,
271
+ errors,
272
+ warnings,
273
+ packageInfo: valid
274
+ ? {
275
+ name: packageJson.name,
276
+ version: packageJson.version,
277
+ displayName: packageJson.displayName,
278
+ description: packageJson.description,
279
+ license: packageJson.license,
280
+ contributors: packageJson.contributors,
281
+ cspExceptions: packageJson.cspExceptions,
282
+ icon: packageJson.icon,
283
+ configurations: packageJson.configurations,
284
+ features: packageJson.features,
285
+ }
286
+ : undefined,
287
+ };
288
+ }
289
+ // ---------------------------------------------------------------------------
290
+ // validatePPTBConfig
291
+ // ---------------------------------------------------------------------------
292
+ function validatePPTBConfig(config) {
293
+ const errors = [];
294
+ const warnings = [];
295
+ if (config === null || typeof config !== "object" || Array.isArray(config)) {
296
+ errors.push("pptb.config.json must be a JSON object");
297
+ return { valid: false, errors, warnings };
298
+ }
299
+ const VALID_ROOT_KEYS = ["invocation"];
300
+ const unknownRootKeys = Object.keys(config).filter((k) => !VALID_ROOT_KEYS.includes(k));
301
+ if (unknownRootKeys.length > 0) {
302
+ warnings.push(`pptb.config.json contains unrecognised root keys: ${unknownRootKeys.join(", ")}`);
303
+ }
304
+ if (config.invocation !== undefined) {
305
+ const inv = config.invocation;
306
+ if (inv === null || typeof inv !== "object" || Array.isArray(inv)) {
307
+ errors.push("invocation must be a non-array object");
308
+ }
309
+ else {
310
+ if (inv.version === undefined || inv.version === null) {
311
+ errors.push("invocation.version is required");
312
+ }
313
+ else if (typeof inv.version !== "string") {
314
+ errors.push("invocation.version must be a string");
315
+ }
316
+ else if (!SEMVER_REGEX.test(inv.version)) {
317
+ errors.push(`invocation.version "${inv.version}" is not a valid semantic version string (e.g. "1.0.0")`);
318
+ }
319
+ if (inv.prefill !== undefined) {
320
+ if (inv.prefill === null || typeof inv.prefill !== "object" || Array.isArray(inv.prefill)) {
321
+ errors.push("invocation.prefill must be a non-array object");
322
+ }
323
+ else if (inv.prefill.properties !== undefined) {
324
+ validateJsonSchemaProperties("invocation.prefill", inv.prefill.properties, errors);
325
+ }
326
+ }
327
+ if (inv.returnTopic !== undefined) {
328
+ if (inv.returnTopic === null || typeof inv.returnTopic !== "object" || Array.isArray(inv.returnTopic)) {
329
+ errors.push("invocation.returnTopic must be a non-array object");
330
+ }
331
+ else if (inv.returnTopic.properties !== undefined) {
332
+ validateJsonSchemaProperties("invocation.returnTopic", inv.returnTopic.properties, errors);
333
+ }
334
+ }
335
+ if (inv.capabilities !== undefined) {
336
+ if (!Array.isArray(inv.capabilities)) {
337
+ errors.push("invocation.capabilities must be an array");
338
+ }
339
+ else {
340
+ inv.capabilities.forEach((cap, idx) => {
341
+ if (typeof cap !== "string" || cap.trim().length === 0) {
342
+ errors.push(`invocation.capabilities[${idx}] must be a non-empty string`);
343
+ }
344
+ else if (!exports.KNOWN_CAPABILITY_TAGS.includes(cap.trim())) {
345
+ warnings.push(`invocation.capabilities[${idx}] "${cap}" is not a recognised capability tag. ` +
346
+ `Known tags: ${exports.KNOWN_CAPABILITY_TAGS.join(", ")}. ` +
347
+ "If this is a new tag, ensure it has been added to the capability registry.");
348
+ }
349
+ });
350
+ }
351
+ }
352
+ }
353
+ }
354
+ const valid = errors.length === 0;
355
+ return {
356
+ valid,
357
+ errors,
358
+ warnings,
359
+ packageInfo: valid ? { invocation: config.invocation } : undefined,
360
+ };
361
+ }
362
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@pptb/validate",
3
+ "version": "0.0.1",
4
+ "description": "Validation utilities for Power Platform ToolBox tool packages",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "keywords": [
8
+ "powerplatform",
9
+ "pptb",
10
+ "toolbox",
11
+ "validate",
12
+ "typescript",
13
+ "dataverse"
14
+ ],
15
+ "author": "Power Platform ToolBox",
16
+ "license": "GPL-3.0",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "https://github.com/PowerPlatformToolBox/desktop-app.git",
20
+ "directory": "packages"
21
+ },
22
+ "packageManager": "pnpm@10.18.3",
23
+ "exports": {
24
+ ".": {
25
+ "require": "./dist/index.js",
26
+ "types": "./dist/index.d.ts"
27
+ },
28
+ "./cli": "./dist/cli.js"
29
+ },
30
+ "bin": {
31
+ "pptb-validate": "./dist/cli.js"
32
+ },
33
+ "files": [
34
+ "dist"
35
+ ],
36
+ "scripts": {
37
+ "build": "tsc",
38
+ "prepublishOnly": "npm run build",
39
+ "version-stable": "npm version patch --no-git-tag-version",
40
+ "publish-package": "npm run build && npm publish --access public"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^20.19.21",
44
+ "@types/tar": "^7.0.87",
45
+ "typescript": "^5.4.0"
46
+ },
47
+ "dependencies": {
48
+ "tar": "^7.5.16"
49
+ }
50
+ }