diff --git a/package-lock.json b/package-lock.json index fc5852b5..474d14c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,6 +30,7 @@ "husky": "^8.0.3", "lint-staged": "^13.2.3", "prettier": "^3.0.0", + "ts-json-schema-generator": "^1.2.0", "typescript": "^5.1.6" }, "engines": { @@ -4527,6 +4528,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/semver": { "version": "7.5.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", @@ -4879,6 +4889,101 @@ "node": ">=8" } }, + "node_modules/ts-json-schema-generator": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-1.2.0.tgz", + "integrity": "sha512-tUMeO3ZvA12d3HHh7T/AK8W5hmUhDRNtqWRHSMN3ZRbUFt+UmV0oX8k1RK4SA+a+BKNHpmW2v06MS49e8Fi3Yg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.11", + "commander": "^9.4.1", + "glob": "^8.0.3", + "json5": "^2.2.1", + "normalize-path": "^3.0.0", + "safe-stable-stringify": "^2.4.1", + "typescript": "~4.9.3" + }, + "bin": { + "ts-json-schema-generator": "bin/ts-json-schema-generator" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ts-json-schema-generator/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ts-json-schema-generator/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/ts-json-schema-generator/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ts-json-schema-generator/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ts-json-schema-generator/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-json-schema-generator/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", diff --git a/package.json b/package.json index f33222e3..9ed2746e 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "npm": "9" }, "scripts": { + "build:schema": "ts-json-schema-generator --path ./src/schemas/Schema.ts --type Schema > src/schemas/transistor-config.schema.json", "lint": "eslint --max-warnings=0 .", "lint:fix": "eslint --fix --max-warnings=0 .", "prepare": "husky install", @@ -53,6 +54,7 @@ "husky": "^8.0.3", "lint-staged": "^13.2.3", "prettier": "^3.0.0", + "ts-json-schema-generator": "^1.2.0", "typescript": "^5.1.6" } } diff --git a/src/schemas/Schema.ts b/src/schemas/Schema.ts new file mode 100644 index 00000000..42e45ec2 --- /dev/null +++ b/src/schemas/Schema.ts @@ -0,0 +1,65 @@ +/* + * Copyright IBM Corp. 2023, 2023 + * + * This source code is licensed under the Apache-2.0 license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * Configuration outline for metrics collection using IBM transistor + * @title Transistor Config Schema + * @id https://[HOSTHERE]/schemas/transistor-config.schema.json + */ +export interface Schema { + /** + * Current schema version + */ + version: 1 + /** + * Unique identifier assigned on a per-project basis. + */ + projectId: string + /** + * The keys under `collect` represent the various types of data that + * Transistor is capable of collecting (i.e. `scopes`). + * @minProperties 1 + */ + collect: { + /** + * Configuration for collecting telemetry data from an npm environment. + * @minProperties 1 + */ + npm?: { + /** + * Enable telemetry data collection for package.json `dependencies` and `devDependencies`. + */ + dependencies?: null + } + /** + * Configuration for collecting telemetry data from JSX files. + * @minProperties 1 + */ + jsx?: { + /** + * Enable telemetry data collection for JSX elements. The set of included elements is + * determined by looking at import/require statements across analyzed source files. + */ + elements?: { + /** + * Enable telemetry data collection for specific JSX attributes. + * These are collected for all included JSX elements. + * Specifying an `attributeName` here will turn on data collection for + * boolean and numeric attribute values. + * String value data collection is handled separately + * via the `allowedAttributeStringValues` key. + */ + allowedAttributeNames?: [string, ...string[]] + /** + * Enable telemetry data collection for specific string attribute values. + * These are collected for all defined attributes in the `allowedAttributeNames` key. + */ + allowedAttributeStringValues?: [string, ...string[]] + } + } + } +} diff --git a/src/schemas/test.yml b/src/schemas/test.yml new file mode 100644 index 00000000..b88a79d3 --- /dev/null +++ b/src/schemas/test.yml @@ -0,0 +1,12 @@ +# yaml-language-server: $schema=./transistor-config.schema.json +version: 1 +collect: + npm: + dependencies: + jsx: + elements: + allowedAttributeStringValues: + - "one" + - "two" + +projectId: "1234"