@cloudcare/guance-front-tools 1.0.0
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/.prettierignore +3 -0
- package/.prettierrc +6 -0
- package/LICENSE +21 -0
- package/README.md +31 -0
- package/cli.js +16 -0
- package/lib/cjs/generated/browserSessionReplay.d.ts +703 -0
- package/lib/cjs/generated/browserSessionReplay.js +6 -0
- package/lib/cjs/generated/dashboardCharts.d.ts +1372 -0
- package/lib/cjs/generated/dashboardCharts.js +6 -0
- package/lib/cjs/generated/mobileSessionReplay.d.ts +653 -0
- package/lib/cjs/generated/mobileSessionReplay.js +6 -0
- package/lib/cjs/generated/sessionReplay.d.ts +1190 -0
- package/lib/cjs/generated/sessionReplay.js +6 -0
- package/lib/cjs/src/dashboard-charts.d.ts +1 -0
- package/lib/cjs/src/dashboard-charts.js +17 -0
- package/lib/cjs/src/index.d.ts +2 -0
- package/lib/cjs/src/index.js +18 -0
- package/lib/cjs/src/session-replay-browser.d.ts +58 -0
- package/lib/cjs/src/session-replay-browser.js +69 -0
- package/lib/cjs/src/session-replay-mobile.d.ts +30 -0
- package/lib/cjs/src/session-replay-mobile.js +42 -0
- package/lib/cjs/src/session-replay.d.ts +30 -0
- package/lib/cjs/src/session-replay.js +49 -0
- package/lib/esm/generated/browserSessionReplay.d.ts +703 -0
- package/lib/esm/generated/browserSessionReplay.js +5 -0
- package/lib/esm/generated/dashboardCharts.d.ts +1372 -0
- package/lib/esm/generated/dashboardCharts.js +5 -0
- package/lib/esm/generated/mobileSessionReplay.d.ts +653 -0
- package/lib/esm/generated/mobileSessionReplay.js +5 -0
- package/lib/esm/generated/sessionReplay.d.ts +1190 -0
- package/lib/esm/generated/sessionReplay.js +5 -0
- package/lib/esm/src/dashboard-charts.d.ts +1 -0
- package/lib/esm/src/dashboard-charts.js +1 -0
- package/lib/esm/src/index.d.ts +2 -0
- package/lib/esm/src/index.js +2 -0
- package/lib/esm/src/session-replay-browser.d.ts +58 -0
- package/lib/esm/src/session-replay-browser.js +52 -0
- package/lib/esm/src/session-replay-mobile.d.ts +30 -0
- package/lib/esm/src/session-replay-mobile.js +25 -0
- package/lib/esm/src/session-replay.d.ts +30 -0
- package/lib/esm/src/session-replay.js +24 -0
- package/lib/example/grafana-dashboard.json +2205 -0
- package/lib/example/guance-covert-test.json +629 -0
- package/lib/example/guance-dashboard-1.json +672 -0
- package/lib/example/guance-dashboard.json +2841 -0
- package/lib/scripts/grafana-covert-to-guance.d.ts +1 -0
- package/lib/scripts/grafana-covert-to-guance.js +367 -0
- package/lib/scripts/grafana-covert-to-guance.ts +374 -0
- package/lib/scripts/grafana-dashbord.d.ts +2220 -0
- package/lib/scripts/grafana-dashbord.js +1 -0
- package/lib/scripts/grafana-dashbord.ts +2427 -0
- package/lib/src/dashboard-charts.ts +1 -0
- package/lib/src/index.ts +2 -0
- package/lib/src/session-replay-browser.ts +98 -0
- package/lib/src/session-replay-mobile.ts +54 -0
- package/lib/src/session-replay.ts +61 -0
- package/package.json +45 -0
- package/samples/dashboard/dashboard.json +2842 -0
- package/samples/dashboard/promql-dashboard.json +2175 -0
- package/samples/session-replay/mobile/record/full-snapshot-record.json +51 -0
- package/samples/session-replay/mobile/record/has-focus-record.json +7 -0
- package/samples/session-replay/mobile/record/incremental-snapshot-record.json +74 -0
- package/samples/session-replay/mobile/record/metadata-record.json +8 -0
- package/samples/session-replay/mobile/record/view-end-record.json +4 -0
- package/samples/session-replay/mobile/segment/segment.json +110 -0
- package/schemas/charts/chart-schema.json +73 -0
- package/schemas/charts/common/common-chart-types-schema.json +37 -0
- package/schemas/charts/common/common-vars-item-schema.json +117 -0
- package/schemas/charts/common/common-vars-schema.json +10 -0
- package/schemas/charts/dashboard-schema.json +73 -0
- package/schemas/charts/query/queries-schema.json +10 -0
- package/schemas/charts/query/query-item-schema.json +42 -0
- package/schemas/charts/settings/_common-settings-connect-null-schema.json +7 -0
- package/schemas/charts/settings/_common-settings-gradual-color-schema.json +72 -0
- package/schemas/charts/settings/_common-settings-groupby-schema.json +22 -0
- package/schemas/charts/settings/_common-settings-legend-position-schema.json +14 -0
- package/schemas/charts/settings/_common-settings-legend-values-schema.json +19 -0
- package/schemas/charts/settings/_common-settings-open-stack-schema.json +8 -0
- package/schemas/charts/settings/_common-settings-show-label-schema.json +8 -0
- package/schemas/charts/settings/_common-settings-show-line-schema.json +8 -0
- package/schemas/charts/settings/_common-settings-stack-content-schema.json +12 -0
- package/schemas/charts/settings/_common-settings-stack-type-schema.json +11 -0
- package/schemas/charts/settings/chart-alarm-settings-schema.json +48 -0
- package/schemas/charts/settings/chart-bar-settings-schema.json +69 -0
- package/schemas/charts/settings/chart-chinamap-settings-schema.json +102 -0
- package/schemas/charts/settings/chart-funnel-settings-schema.json +34 -0
- package/schemas/charts/settings/chart-gauge-settings-schema.json +65 -0
- package/schemas/charts/settings/chart-heatmap-settings-schema.json +50 -0
- package/schemas/charts/settings/chart-hexgon-settings-schema.json +90 -0
- package/schemas/charts/settings/chart-histogram-settings-schema.json +47 -0
- package/schemas/charts/settings/chart-iframe-settings-schema.json +24 -0
- package/schemas/charts/settings/chart-log-settings-schema.json +84 -0
- package/schemas/charts/settings/chart-object-settings-schema.json +52 -0
- package/schemas/charts/settings/chart-picture-settings-schema.json +46 -0
- package/schemas/charts/settings/chart-pie-settings-schema.json +90 -0
- package/schemas/charts/settings/chart-sankey-settings-schema.json +34 -0
- package/schemas/charts/settings/chart-scatter-bubble-settings-schema.json +31 -0
- package/schemas/charts/settings/chart-sequence-settings-schema.json +76 -0
- package/schemas/charts/settings/chart-singlestat-settings-schema.json +163 -0
- package/schemas/charts/settings/chart-table-settings-schema.json +184 -0
- package/schemas/charts/settings/chart-text-settings-schema.json +20 -0
- package/schemas/charts/settings/chart-toplist-settings-schema.json +117 -0
- package/schemas/charts/settings/chart-topology-settings-schema.json +71 -0
- package/schemas/charts/settings/chart-treemap-settings-schema.json +66 -0
- package/schemas/charts/settings/chart-worldmap-settings-schema.json +102 -0
- package/schemas/charts/settings/common-settings-schema.json +82 -0
- package/schemas/charts/settings/settings-alias-schema.json +47 -0
- package/schemas/charts/settings/settings-chart-type-schema.json +27 -0
- package/schemas/charts/settings/settings-colors-schema.json +46 -0
- package/schemas/charts/settings/settings-compare-schema.json +58 -0
- package/schemas/charts/settings/settings-fixed-time-schema.json +49 -0
- package/schemas/charts/settings/settings-levels-schema.json +33 -0
- package/schemas/charts/settings/settings-schema.json +79 -0
- package/schemas/charts/settings/settings-time-schema.json +47 -0
- package/schemas/charts/settings/settings-unit-items-schema.json +226 -0
- package/schemas/charts/settings/settings-units-schema.json +60 -0
- package/schemas/dashboard-schema.json +5 -0
- package/schemas/session-replay/browser/attribute-mutation-schema.json +21 -0
- package/schemas/session-replay/browser/attributes-schema.json +10 -0
- package/schemas/session-replay/browser/cdata-node-schema.json +19 -0
- package/schemas/session-replay/browser/creation-reason-schema.json +17 -0
- package/schemas/session-replay/browser/document-fragment-node-schema.json +35 -0
- package/schemas/session-replay/browser/document-node-schema.json +30 -0
- package/schemas/session-replay/browser/document-type-node-schema.json +28 -0
- package/schemas/session-replay/browser/element-node-schema.json +33 -0
- package/schemas/session-replay/browser/frustration-record-schema.json +49 -0
- package/schemas/session-replay/browser/full-snapshot-record-schema.json +26 -0
- package/schemas/session-replay/browser/incremental-data-schema.json +36 -0
- package/schemas/session-replay/browser/incremental-snapshot-record-schema.json +29 -0
- package/schemas/session-replay/browser/input-data-schema.json +27 -0
- package/schemas/session-replay/browser/input-state-schema.json +27 -0
- package/schemas/session-replay/browser/media-interaction-data-schema.json +23 -0
- package/schemas/session-replay/browser/media-interaction-schema.json +20 -0
- package/schemas/session-replay/browser/mouse-interaction-data-schema.json +23 -0
- package/schemas/session-replay/browser/mouse-interaction-schema.json +47 -0
- package/schemas/session-replay/browser/mouse-move-data-schema.json +23 -0
- package/schemas/session-replay/browser/mouse-position-schema.json +26 -0
- package/schemas/session-replay/browser/mutation-data-schema.json +23 -0
- package/schemas/session-replay/browser/mutation-payload-schema.json +42 -0
- package/schemas/session-replay/browser/node-added-mutation-schema.json +41 -0
- package/schemas/session-replay/browser/node-removed-mutation-schema.json +18 -0
- package/schemas/session-replay/browser/node-schema.json +28 -0
- package/schemas/session-replay/browser/record-schema.json +30 -0
- package/schemas/session-replay/browser/scroll-data-schema.json +23 -0
- package/schemas/session-replay/browser/scroll-position-schema.json +22 -0
- package/schemas/session-replay/browser/segment-metadata-schema.json +28 -0
- package/schemas/session-replay/browser/segment-schema.json +25 -0
- package/schemas/session-replay/browser/serialized-node-schema.json +15 -0
- package/schemas/session-replay/browser/serialized-node-with-id-schema.json +21 -0
- package/schemas/session-replay/browser/stylesheet-rule-add-schema.json +28 -0
- package/schemas/session-replay/browser/stylesheet-rule-data-schema.json +23 -0
- package/schemas/session-replay/browser/stylesheet-rule-delete-schema.json +24 -0
- package/schemas/session-replay/browser/stylesheet-rule-schema.json +29 -0
- package/schemas/session-replay/browser/stylesheet-schema.json +30 -0
- package/schemas/session-replay/browser/text-mutation-schema.json +27 -0
- package/schemas/session-replay/browser/text-node-schema.json +23 -0
- package/schemas/session-replay/common/_common-record-schema.json +14 -0
- package/schemas/session-replay/common/_common-segment-metadata-schema.json +30 -0
- package/schemas/session-replay/common/_slot-supported-common-record-schema.json +21 -0
- package/schemas/session-replay/common/focus-record-schema.json +34 -0
- package/schemas/session-replay/common/meta-record-schema.json +42 -0
- package/schemas/session-replay/common/pointer-interaction-data-schema.json +23 -0
- package/schemas/session-replay/common/pointer-interaction-schema.json +34 -0
- package/schemas/session-replay/common/segment-context-schema.json +46 -0
- package/schemas/session-replay/common/view-end-record-schema.json +23 -0
- package/schemas/session-replay/common/viewport-resize-data-schema.json +23 -0
- package/schemas/session-replay/common/viewport-resize-dimension-schema.json +18 -0
- package/schemas/session-replay/common/visual-viewport-record-schema.json +50 -0
- package/schemas/session-replay/full-snapshot-record-schema.json +14 -0
- package/schemas/session-replay/incremental-data-schema.json +14 -0
- package/schemas/session-replay/incremental-snapshot-record-schema.json +14 -0
- package/schemas/session-replay/mobile/_common-shape-wireframe-schema.json +22 -0
- package/schemas/session-replay/mobile/_common-shape-wireframe-update-schema.json +22 -0
- package/schemas/session-replay/mobile/_common-wireframe-schema.json +38 -0
- package/schemas/session-replay/mobile/_common-wireframe-update-schema.json +38 -0
- package/schemas/session-replay/mobile/full-snapshot-record-schema.json +38 -0
- package/schemas/session-replay/mobile/image-wireframe-schema.json +43 -0
- package/schemas/session-replay/mobile/image-wireframe-update-schema.json +43 -0
- package/schemas/session-replay/mobile/incremental-data-schema.json +21 -0
- package/schemas/session-replay/mobile/incremental-snapshot-record-schema.json +26 -0
- package/schemas/session-replay/mobile/mutation-data-schema.json +23 -0
- package/schemas/session-replay/mobile/mutation-payload-schema.json +55 -0
- package/schemas/session-replay/mobile/placeholder-wireframe-schema.json +28 -0
- package/schemas/session-replay/mobile/placeholder-wireframe-update-schema.json +28 -0
- package/schemas/session-replay/mobile/record-schema.json +27 -0
- package/schemas/session-replay/mobile/segment-metadata-schema.json +25 -0
- package/schemas/session-replay/mobile/segment-schema.json +25 -0
- package/schemas/session-replay/mobile/shape-border-schema.json +25 -0
- package/schemas/session-replay/mobile/shape-style-schema.json +29 -0
- package/schemas/session-replay/mobile/shape-wireframe-schema.json +23 -0
- package/schemas/session-replay/mobile/shape-wireframe-update-schema.json +23 -0
- package/schemas/session-replay/mobile/text-position-schema.json +57 -0
- package/schemas/session-replay/mobile/text-style-schema.json +31 -0
- package/schemas/session-replay/mobile/text-wireframe-schema.json +34 -0
- package/schemas/session-replay/mobile/text-wireframe-update-schema.json +34 -0
- package/schemas/session-replay/mobile/touch-data-schema.json +51 -0
- package/schemas/session-replay/mobile/webview-wireframe-schema.json +33 -0
- package/schemas/session-replay/mobile/webview-wireframe-update-schema.json +33 -0
- package/schemas/session-replay/mobile/wireframe-clip-schema.json +29 -0
- package/schemas/session-replay/mobile/wireframe-schema.json +24 -0
- package/schemas/session-replay/mobile/wireframe-update-mutation-schema.json +24 -0
- package/schemas/session-replay/mutation-data-schema.json +14 -0
- package/schemas/session-replay/mutation-payload-schema.json +14 -0
- package/schemas/session-replay/record-schema.json +14 -0
- package/schemas/session-replay/segment-metadata-schema.json +14 -0
- package/schemas/session-replay/segment-schema.json +15 -0
- package/schemas/session-replay-browser-schema.json +5 -0
- package/schemas/session-replay-mobile-schema.json +5 -0
- package/schemas/session-replay-schema.json +33 -0
- package/scripts/generate.mjs +96 -0
- package/scripts/utils.mjs +16 -0
- package/scripts/validate.mjs +144 -0
- package/tsconfig.cjs.json +7 -0
- package/tsconfig.esm.json +7 -0
- package/tsconfig.json +13 -0
- package/tsconfig.script.json +15 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema",
|
|
3
|
+
"$id": "session-replay-schema.json",
|
|
4
|
+
"title": "SessionReplay",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"description": "Schema of all properties of Session Replay",
|
|
7
|
+
"allOf": [
|
|
8
|
+
{
|
|
9
|
+
"$ref": "session-replay/segment-schema.json"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"$ref": "session-replay/segment-metadata-schema.json"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"$ref": "session-replay/record-schema.json"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"$ref": "session-replay/full-snapshot-record-schema.json"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"$ref": "session-replay/incremental-snapshot-record-schema.json"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"$ref": "session-replay/incremental-data-schema.json"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"$ref": "session-replay/mutation-data-schema.json"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"$ref": "session-replay/mutation-payload-schema.json"
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import * as fs from 'fs'
|
|
2
|
+
import * as path from 'path'
|
|
3
|
+
import { execSync } from 'child_process'
|
|
4
|
+
import prettier from 'prettier'
|
|
5
|
+
import { printLog, logAndExit } from './utils.mjs'
|
|
6
|
+
import { createRequire } from 'module'
|
|
7
|
+
const require = createRequire(import.meta.url)
|
|
8
|
+
const pkg = require('../package.json')
|
|
9
|
+
|
|
10
|
+
const SCHEMAS_PATH = 'schemas'
|
|
11
|
+
const PRETTIER_CONFIG = '.prettierrc.yml'
|
|
12
|
+
|
|
13
|
+
const DEFINITIONS = [
|
|
14
|
+
{
|
|
15
|
+
source: 'session-replay-browser-schema.json',
|
|
16
|
+
name: 'browserSessionReplay',
|
|
17
|
+
options: { additionalProperties: false },
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
source: 'session-replay-mobile-schema.json',
|
|
21
|
+
name: 'mobileSessionReplay',
|
|
22
|
+
options: { additionalProperties: false },
|
|
23
|
+
},
|
|
24
|
+
{ source: 'session-replay-schema.json', name: 'sessionReplay', options: { additionalProperties: false } },
|
|
25
|
+
{
|
|
26
|
+
source: 'dashboard-schema.json',
|
|
27
|
+
name: 'dashboardCharts',
|
|
28
|
+
options: {
|
|
29
|
+
additionalProperties: true,
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
const GENERATED_PATH = path.normalize(pkg.config['path:generated'])
|
|
35
|
+
main().catch(logAndExit)
|
|
36
|
+
|
|
37
|
+
async function main() {
|
|
38
|
+
fs.rmSync(GENERATED_PATH, { recursive: true, force: true })
|
|
39
|
+
fs.mkdirSync(GENERATED_PATH)
|
|
40
|
+
|
|
41
|
+
DEFINITIONS.forEach(async (definition) => {
|
|
42
|
+
const { source, name, options } = definition
|
|
43
|
+
await generateTypesFromSchema(path.join(GENERATED_PATH, `${name}.ts`), source, { options })
|
|
44
|
+
})
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async function generateTypesFromSchema(typesPath, schema, { options = {} } = {}) {
|
|
48
|
+
const { compileFromFile } = await getJsonSchemaToTypescript()
|
|
49
|
+
const schemaPath = path.join(SCHEMAS_PATH, schema)
|
|
50
|
+
const prettierConfig = await prettier.resolveConfig(PRETTIER_CONFIG)
|
|
51
|
+
printLog(`Compiling ${schemaPath}...`)
|
|
52
|
+
const compiledTypes = await compileFromFile(schemaPath, {
|
|
53
|
+
cwd: SCHEMAS_PATH,
|
|
54
|
+
bannerComment: '/* eslint-disable */\n/**\n * DO NOT MODIFY IT BY HAND. Run `yarn generate` instead.\n*/',
|
|
55
|
+
style: prettierConfig,
|
|
56
|
+
...options,
|
|
57
|
+
})
|
|
58
|
+
printLog(`Writing ${typesPath}...`)
|
|
59
|
+
fs.writeFileSync(typesPath, compiledTypes)
|
|
60
|
+
printLog('Generation done.')
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function getJsonSchemaToTypescript() {
|
|
64
|
+
if (!getJsonSchemaToTypescript.cache) {
|
|
65
|
+
getJsonSchemaToTypescript.cache = import('json-schema-to-typescript').catch((error) => {
|
|
66
|
+
if (error.code !== 'ERR_MODULE_NOT_FOUND') {
|
|
67
|
+
throw error
|
|
68
|
+
}
|
|
69
|
+
buildJsonSchemaToTypescript()
|
|
70
|
+
return import('json-schema-to-typescript')
|
|
71
|
+
})
|
|
72
|
+
}
|
|
73
|
+
return getJsonSchemaToTypescript.cache
|
|
74
|
+
|
|
75
|
+
function buildJsonSchemaToTypescript() {
|
|
76
|
+
printLog('json-schema-to-typescript not built. Building...')
|
|
77
|
+
|
|
78
|
+
execSync(
|
|
79
|
+
`
|
|
80
|
+
set -eu
|
|
81
|
+
cd ./node_modules/json-schema-to-typescript
|
|
82
|
+
rm -rf dist
|
|
83
|
+
# due to installation on node_modules, some of these steps can fail
|
|
84
|
+
# built version still behaves correctly though
|
|
85
|
+
set +e
|
|
86
|
+
npm i
|
|
87
|
+
npm run clean
|
|
88
|
+
npm run build:server
|
|
89
|
+
set -e
|
|
90
|
+
`,
|
|
91
|
+
{
|
|
92
|
+
stdio: 'inherit',
|
|
93
|
+
}
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const resetColor = '\x1b[0m'
|
|
2
|
+
|
|
3
|
+
export function printLog(...params) {
|
|
4
|
+
const greenColor = '\x1b[32;1m'
|
|
5
|
+
console.log(greenColor, ...params, resetColor)
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function printError(...params) {
|
|
9
|
+
const redColor = '\x1b[31;1m'
|
|
10
|
+
console.log(redColor, ...params, resetColor)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function logAndExit(error) {
|
|
14
|
+
printError('\nStacktrace:\n', error)
|
|
15
|
+
process.exit(1)
|
|
16
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import path from 'path'
|
|
2
|
+
import Ajv from 'ajv'
|
|
3
|
+
import { readdirSync, readFileSync } from 'fs'
|
|
4
|
+
|
|
5
|
+
const SAMPLES_DIRECTORY = './samples'
|
|
6
|
+
const SCHEMAS_DIRECTORY = './schemas'
|
|
7
|
+
|
|
8
|
+
validateSchemasObjectsPropertiesCase()
|
|
9
|
+
validateSchemasIds()
|
|
10
|
+
validateSamples()
|
|
11
|
+
|
|
12
|
+
if (process.exitCode !== 0 && process.exitCode !== undefined) {
|
|
13
|
+
console.log('❌ Some validation errors were found')
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function validateSchemasObjectsPropertiesCase() {
|
|
17
|
+
// Some properties don't follow the convention. Ideally they should be fixed in the future.
|
|
18
|
+
const CASING_EXCEPTIONS = new Map([
|
|
19
|
+
[
|
|
20
|
+
`${SCHEMAS_DIRECTORY}/session-replay/common/_common-segment-metadata-schema.json`,
|
|
21
|
+
['records_count', 'index_in_view', 'has_full_snapshot'],
|
|
22
|
+
],
|
|
23
|
+
[`${SCHEMAS_DIRECTORY}/session-replay/common/focus-record-schema.json`, ['has_focus']],
|
|
24
|
+
])
|
|
25
|
+
|
|
26
|
+
let displayConvention = false
|
|
27
|
+
|
|
28
|
+
forEachFile(SCHEMAS_DIRECTORY, (schemaPath) => {
|
|
29
|
+
if (!schemaPath.match(/\.json$/)) return
|
|
30
|
+
const schema = readJson(schemaPath)
|
|
31
|
+
|
|
32
|
+
const caseExceptions = CASING_EXCEPTIONS.get(schemaPath) || []
|
|
33
|
+
|
|
34
|
+
forEachObjectProperty(schema, (key) => {
|
|
35
|
+
const isCorrectCase = isCamelCase(key)
|
|
36
|
+
if (!isCorrectCase && !caseExceptions.includes(key)) {
|
|
37
|
+
console.log(`❌ Schema ${schemaPath} property ${key} is not $camelCase`)
|
|
38
|
+
displayConvention = true
|
|
39
|
+
process.exitCode = 1
|
|
40
|
+
}
|
|
41
|
+
})
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
if (displayConvention) {
|
|
45
|
+
console.log(
|
|
46
|
+
'ℹ️ RUM and telemetry schemas object properties should be snake_case, other schemas objects should be camelCase'
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function validateSchemasIds() {
|
|
52
|
+
forEachFile(SCHEMAS_DIRECTORY, (schemaPath) => {
|
|
53
|
+
if (!schemaPath.match(/\.json$/)) return
|
|
54
|
+
const schema = readJson(schemaPath)
|
|
55
|
+
|
|
56
|
+
// We need to be careful about schema ids because they need to:
|
|
57
|
+
// * be unique, or else Ajv will throw
|
|
58
|
+
// * represent a path, as Ajv will use it to resolve $refs
|
|
59
|
+
// Here, we make sure that both requirements are respected.
|
|
60
|
+
const schemaId = computeSchemaIdFromSchemaPath(schemaPath)
|
|
61
|
+
if (schema.$id !== schemaId) {
|
|
62
|
+
console.log(`❌ Schema ${schemaPath} $id should be ${schemaId}`)
|
|
63
|
+
process.exitCode = 1
|
|
64
|
+
}
|
|
65
|
+
})
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function validateSamples() {
|
|
69
|
+
const ajv = new Ajv()
|
|
70
|
+
forEachFile(SCHEMAS_DIRECTORY, (schemaPath) => {
|
|
71
|
+
if (!schemaPath.match(/\.json$/)) return
|
|
72
|
+
ajv.addSchema(readJson(schemaPath))
|
|
73
|
+
})
|
|
74
|
+
forEachFile(SAMPLES_DIRECTORY, (samplePath) => {
|
|
75
|
+
if (!samplePath.match(/\.json$/)) return
|
|
76
|
+
const schemaId = computeSchemaIdFromSamplePath(samplePath)
|
|
77
|
+
const valid = ajv.validate(schemaId, readJson(samplePath))
|
|
78
|
+
if (valid) {
|
|
79
|
+
console.log(`✅ ${samplePath}`)
|
|
80
|
+
} else {
|
|
81
|
+
console.log(`❌ ${samplePath} is not valid against ${schemaId}:`)
|
|
82
|
+
console.log(` - ${ajv.errorsText(undefined, { separator: '\n - ' })}`)
|
|
83
|
+
process.exitCode = 1
|
|
84
|
+
}
|
|
85
|
+
})
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function computeSchemaIdFromSchemaPath(schemaPath) {
|
|
89
|
+
// Strip the schema directory from the provided path:
|
|
90
|
+
// "./schemas/session-replay/mobile/record-schema.json" -> "session-replay/mobile/record-schema.json"
|
|
91
|
+
return schemaPath.slice(SCHEMAS_DIRECTORY.length + 1)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function computeSchemaIdFromSamplePath(samplePath) {
|
|
95
|
+
// Keep only the directory path and strip the sample directory from the provided path:
|
|
96
|
+
// "./samples/session-replay/mobile/record/full-snapshot-record.json" -> "session-replay/mobile/record-schema.json"
|
|
97
|
+
return `${path.dirname(samplePath).slice(SAMPLES_DIRECTORY.length + 1)}-schema.json`
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function forEachFile(directoryPath, callback) {
|
|
101
|
+
for (const entry of readdirSync(directoryPath, { withFileTypes: true })) {
|
|
102
|
+
const entryPath = `${directoryPath}/${entry.name}`
|
|
103
|
+
if (entry.isFile()) {
|
|
104
|
+
callback(entryPath)
|
|
105
|
+
} else {
|
|
106
|
+
forEachFile(entryPath, callback)
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function readJson(filePath) {
|
|
112
|
+
return JSON.parse(readFileSync(filePath, 'utf8'))
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Iterates over each properties of objects specified in the provided JSON schema.
|
|
117
|
+
*/
|
|
118
|
+
function forEachObjectProperty(schema, callback) {
|
|
119
|
+
if (Array.isArray(schema)) {
|
|
120
|
+
// traverse arrays
|
|
121
|
+
for (const value of schema) {
|
|
122
|
+
forEachObjectProperty(value, callback)
|
|
123
|
+
}
|
|
124
|
+
} else if (typeof schema === 'object' && schema !== null) {
|
|
125
|
+
// traverse objects
|
|
126
|
+
for (const value of Object.values(schema)) {
|
|
127
|
+
forEachObjectProperty(value, callback)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (schema.type === 'object' && schema.properties) {
|
|
131
|
+
for (const [key, value] of Object.entries(schema.properties)) {
|
|
132
|
+
callback(key, value)
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function isSnakeCase(str) {
|
|
139
|
+
return /^[a-z0-9_]+$/.test(str)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function isCamelCase(str) {
|
|
143
|
+
return /^[a-z0-9][A-Za-z0-9]*$/.test(str)
|
|
144
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"strict": true,
|
|
4
|
+
"target": "es5",
|
|
5
|
+
"types": [],
|
|
6
|
+
"esModuleInterop": true,
|
|
7
|
+
"moduleResolution": "Node",
|
|
8
|
+
"outDir": "lib",
|
|
9
|
+
"declaration": true,
|
|
10
|
+
"resolveJsonModule": true
|
|
11
|
+
},
|
|
12
|
+
"include": ["./lib/src/*.ts", "!./lib/script/*.ts"]
|
|
13
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"types": ["node"],
|
|
4
|
+
"esModuleInterop": true,
|
|
5
|
+
"moduleResolution": "node",
|
|
6
|
+
"module": "ES6",
|
|
7
|
+
"target": "ES6",
|
|
8
|
+
"outDir": "lib",
|
|
9
|
+
"declaration": false,
|
|
10
|
+
"resolveJsonModule": true,
|
|
11
|
+
"typeRoots": ["./node_modules/@types"]
|
|
12
|
+
},
|
|
13
|
+
"include": ["./lib/scripts/*.ts"],
|
|
14
|
+
"exclude": []
|
|
15
|
+
}
|