@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.
Files changed (216) hide show
  1. package/.prettierignore +3 -0
  2. package/.prettierrc +6 -0
  3. package/LICENSE +21 -0
  4. package/README.md +31 -0
  5. package/cli.js +16 -0
  6. package/lib/cjs/generated/browserSessionReplay.d.ts +703 -0
  7. package/lib/cjs/generated/browserSessionReplay.js +6 -0
  8. package/lib/cjs/generated/dashboardCharts.d.ts +1372 -0
  9. package/lib/cjs/generated/dashboardCharts.js +6 -0
  10. package/lib/cjs/generated/mobileSessionReplay.d.ts +653 -0
  11. package/lib/cjs/generated/mobileSessionReplay.js +6 -0
  12. package/lib/cjs/generated/sessionReplay.d.ts +1190 -0
  13. package/lib/cjs/generated/sessionReplay.js +6 -0
  14. package/lib/cjs/src/dashboard-charts.d.ts +1 -0
  15. package/lib/cjs/src/dashboard-charts.js +17 -0
  16. package/lib/cjs/src/index.d.ts +2 -0
  17. package/lib/cjs/src/index.js +18 -0
  18. package/lib/cjs/src/session-replay-browser.d.ts +58 -0
  19. package/lib/cjs/src/session-replay-browser.js +69 -0
  20. package/lib/cjs/src/session-replay-mobile.d.ts +30 -0
  21. package/lib/cjs/src/session-replay-mobile.js +42 -0
  22. package/lib/cjs/src/session-replay.d.ts +30 -0
  23. package/lib/cjs/src/session-replay.js +49 -0
  24. package/lib/esm/generated/browserSessionReplay.d.ts +703 -0
  25. package/lib/esm/generated/browserSessionReplay.js +5 -0
  26. package/lib/esm/generated/dashboardCharts.d.ts +1372 -0
  27. package/lib/esm/generated/dashboardCharts.js +5 -0
  28. package/lib/esm/generated/mobileSessionReplay.d.ts +653 -0
  29. package/lib/esm/generated/mobileSessionReplay.js +5 -0
  30. package/lib/esm/generated/sessionReplay.d.ts +1190 -0
  31. package/lib/esm/generated/sessionReplay.js +5 -0
  32. package/lib/esm/src/dashboard-charts.d.ts +1 -0
  33. package/lib/esm/src/dashboard-charts.js +1 -0
  34. package/lib/esm/src/index.d.ts +2 -0
  35. package/lib/esm/src/index.js +2 -0
  36. package/lib/esm/src/session-replay-browser.d.ts +58 -0
  37. package/lib/esm/src/session-replay-browser.js +52 -0
  38. package/lib/esm/src/session-replay-mobile.d.ts +30 -0
  39. package/lib/esm/src/session-replay-mobile.js +25 -0
  40. package/lib/esm/src/session-replay.d.ts +30 -0
  41. package/lib/esm/src/session-replay.js +24 -0
  42. package/lib/example/grafana-dashboard.json +2205 -0
  43. package/lib/example/guance-covert-test.json +629 -0
  44. package/lib/example/guance-dashboard-1.json +672 -0
  45. package/lib/example/guance-dashboard.json +2841 -0
  46. package/lib/scripts/grafana-covert-to-guance.d.ts +1 -0
  47. package/lib/scripts/grafana-covert-to-guance.js +367 -0
  48. package/lib/scripts/grafana-covert-to-guance.ts +374 -0
  49. package/lib/scripts/grafana-dashbord.d.ts +2220 -0
  50. package/lib/scripts/grafana-dashbord.js +1 -0
  51. package/lib/scripts/grafana-dashbord.ts +2427 -0
  52. package/lib/src/dashboard-charts.ts +1 -0
  53. package/lib/src/index.ts +2 -0
  54. package/lib/src/session-replay-browser.ts +98 -0
  55. package/lib/src/session-replay-mobile.ts +54 -0
  56. package/lib/src/session-replay.ts +61 -0
  57. package/package.json +45 -0
  58. package/samples/dashboard/dashboard.json +2842 -0
  59. package/samples/dashboard/promql-dashboard.json +2175 -0
  60. package/samples/session-replay/mobile/record/full-snapshot-record.json +51 -0
  61. package/samples/session-replay/mobile/record/has-focus-record.json +7 -0
  62. package/samples/session-replay/mobile/record/incremental-snapshot-record.json +74 -0
  63. package/samples/session-replay/mobile/record/metadata-record.json +8 -0
  64. package/samples/session-replay/mobile/record/view-end-record.json +4 -0
  65. package/samples/session-replay/mobile/segment/segment.json +110 -0
  66. package/schemas/charts/chart-schema.json +73 -0
  67. package/schemas/charts/common/common-chart-types-schema.json +37 -0
  68. package/schemas/charts/common/common-vars-item-schema.json +117 -0
  69. package/schemas/charts/common/common-vars-schema.json +10 -0
  70. package/schemas/charts/dashboard-schema.json +73 -0
  71. package/schemas/charts/query/queries-schema.json +10 -0
  72. package/schemas/charts/query/query-item-schema.json +42 -0
  73. package/schemas/charts/settings/_common-settings-connect-null-schema.json +7 -0
  74. package/schemas/charts/settings/_common-settings-gradual-color-schema.json +72 -0
  75. package/schemas/charts/settings/_common-settings-groupby-schema.json +22 -0
  76. package/schemas/charts/settings/_common-settings-legend-position-schema.json +14 -0
  77. package/schemas/charts/settings/_common-settings-legend-values-schema.json +19 -0
  78. package/schemas/charts/settings/_common-settings-open-stack-schema.json +8 -0
  79. package/schemas/charts/settings/_common-settings-show-label-schema.json +8 -0
  80. package/schemas/charts/settings/_common-settings-show-line-schema.json +8 -0
  81. package/schemas/charts/settings/_common-settings-stack-content-schema.json +12 -0
  82. package/schemas/charts/settings/_common-settings-stack-type-schema.json +11 -0
  83. package/schemas/charts/settings/chart-alarm-settings-schema.json +48 -0
  84. package/schemas/charts/settings/chart-bar-settings-schema.json +69 -0
  85. package/schemas/charts/settings/chart-chinamap-settings-schema.json +102 -0
  86. package/schemas/charts/settings/chart-funnel-settings-schema.json +34 -0
  87. package/schemas/charts/settings/chart-gauge-settings-schema.json +65 -0
  88. package/schemas/charts/settings/chart-heatmap-settings-schema.json +50 -0
  89. package/schemas/charts/settings/chart-hexgon-settings-schema.json +90 -0
  90. package/schemas/charts/settings/chart-histogram-settings-schema.json +47 -0
  91. package/schemas/charts/settings/chart-iframe-settings-schema.json +24 -0
  92. package/schemas/charts/settings/chart-log-settings-schema.json +84 -0
  93. package/schemas/charts/settings/chart-object-settings-schema.json +52 -0
  94. package/schemas/charts/settings/chart-picture-settings-schema.json +46 -0
  95. package/schemas/charts/settings/chart-pie-settings-schema.json +90 -0
  96. package/schemas/charts/settings/chart-sankey-settings-schema.json +34 -0
  97. package/schemas/charts/settings/chart-scatter-bubble-settings-schema.json +31 -0
  98. package/schemas/charts/settings/chart-sequence-settings-schema.json +76 -0
  99. package/schemas/charts/settings/chart-singlestat-settings-schema.json +163 -0
  100. package/schemas/charts/settings/chart-table-settings-schema.json +184 -0
  101. package/schemas/charts/settings/chart-text-settings-schema.json +20 -0
  102. package/schemas/charts/settings/chart-toplist-settings-schema.json +117 -0
  103. package/schemas/charts/settings/chart-topology-settings-schema.json +71 -0
  104. package/schemas/charts/settings/chart-treemap-settings-schema.json +66 -0
  105. package/schemas/charts/settings/chart-worldmap-settings-schema.json +102 -0
  106. package/schemas/charts/settings/common-settings-schema.json +82 -0
  107. package/schemas/charts/settings/settings-alias-schema.json +47 -0
  108. package/schemas/charts/settings/settings-chart-type-schema.json +27 -0
  109. package/schemas/charts/settings/settings-colors-schema.json +46 -0
  110. package/schemas/charts/settings/settings-compare-schema.json +58 -0
  111. package/schemas/charts/settings/settings-fixed-time-schema.json +49 -0
  112. package/schemas/charts/settings/settings-levels-schema.json +33 -0
  113. package/schemas/charts/settings/settings-schema.json +79 -0
  114. package/schemas/charts/settings/settings-time-schema.json +47 -0
  115. package/schemas/charts/settings/settings-unit-items-schema.json +226 -0
  116. package/schemas/charts/settings/settings-units-schema.json +60 -0
  117. package/schemas/dashboard-schema.json +5 -0
  118. package/schemas/session-replay/browser/attribute-mutation-schema.json +21 -0
  119. package/schemas/session-replay/browser/attributes-schema.json +10 -0
  120. package/schemas/session-replay/browser/cdata-node-schema.json +19 -0
  121. package/schemas/session-replay/browser/creation-reason-schema.json +17 -0
  122. package/schemas/session-replay/browser/document-fragment-node-schema.json +35 -0
  123. package/schemas/session-replay/browser/document-node-schema.json +30 -0
  124. package/schemas/session-replay/browser/document-type-node-schema.json +28 -0
  125. package/schemas/session-replay/browser/element-node-schema.json +33 -0
  126. package/schemas/session-replay/browser/frustration-record-schema.json +49 -0
  127. package/schemas/session-replay/browser/full-snapshot-record-schema.json +26 -0
  128. package/schemas/session-replay/browser/incremental-data-schema.json +36 -0
  129. package/schemas/session-replay/browser/incremental-snapshot-record-schema.json +29 -0
  130. package/schemas/session-replay/browser/input-data-schema.json +27 -0
  131. package/schemas/session-replay/browser/input-state-schema.json +27 -0
  132. package/schemas/session-replay/browser/media-interaction-data-schema.json +23 -0
  133. package/schemas/session-replay/browser/media-interaction-schema.json +20 -0
  134. package/schemas/session-replay/browser/mouse-interaction-data-schema.json +23 -0
  135. package/schemas/session-replay/browser/mouse-interaction-schema.json +47 -0
  136. package/schemas/session-replay/browser/mouse-move-data-schema.json +23 -0
  137. package/schemas/session-replay/browser/mouse-position-schema.json +26 -0
  138. package/schemas/session-replay/browser/mutation-data-schema.json +23 -0
  139. package/schemas/session-replay/browser/mutation-payload-schema.json +42 -0
  140. package/schemas/session-replay/browser/node-added-mutation-schema.json +41 -0
  141. package/schemas/session-replay/browser/node-removed-mutation-schema.json +18 -0
  142. package/schemas/session-replay/browser/node-schema.json +28 -0
  143. package/schemas/session-replay/browser/record-schema.json +30 -0
  144. package/schemas/session-replay/browser/scroll-data-schema.json +23 -0
  145. package/schemas/session-replay/browser/scroll-position-schema.json +22 -0
  146. package/schemas/session-replay/browser/segment-metadata-schema.json +28 -0
  147. package/schemas/session-replay/browser/segment-schema.json +25 -0
  148. package/schemas/session-replay/browser/serialized-node-schema.json +15 -0
  149. package/schemas/session-replay/browser/serialized-node-with-id-schema.json +21 -0
  150. package/schemas/session-replay/browser/stylesheet-rule-add-schema.json +28 -0
  151. package/schemas/session-replay/browser/stylesheet-rule-data-schema.json +23 -0
  152. package/schemas/session-replay/browser/stylesheet-rule-delete-schema.json +24 -0
  153. package/schemas/session-replay/browser/stylesheet-rule-schema.json +29 -0
  154. package/schemas/session-replay/browser/stylesheet-schema.json +30 -0
  155. package/schemas/session-replay/browser/text-mutation-schema.json +27 -0
  156. package/schemas/session-replay/browser/text-node-schema.json +23 -0
  157. package/schemas/session-replay/common/_common-record-schema.json +14 -0
  158. package/schemas/session-replay/common/_common-segment-metadata-schema.json +30 -0
  159. package/schemas/session-replay/common/_slot-supported-common-record-schema.json +21 -0
  160. package/schemas/session-replay/common/focus-record-schema.json +34 -0
  161. package/schemas/session-replay/common/meta-record-schema.json +42 -0
  162. package/schemas/session-replay/common/pointer-interaction-data-schema.json +23 -0
  163. package/schemas/session-replay/common/pointer-interaction-schema.json +34 -0
  164. package/schemas/session-replay/common/segment-context-schema.json +46 -0
  165. package/schemas/session-replay/common/view-end-record-schema.json +23 -0
  166. package/schemas/session-replay/common/viewport-resize-data-schema.json +23 -0
  167. package/schemas/session-replay/common/viewport-resize-dimension-schema.json +18 -0
  168. package/schemas/session-replay/common/visual-viewport-record-schema.json +50 -0
  169. package/schemas/session-replay/full-snapshot-record-schema.json +14 -0
  170. package/schemas/session-replay/incremental-data-schema.json +14 -0
  171. package/schemas/session-replay/incremental-snapshot-record-schema.json +14 -0
  172. package/schemas/session-replay/mobile/_common-shape-wireframe-schema.json +22 -0
  173. package/schemas/session-replay/mobile/_common-shape-wireframe-update-schema.json +22 -0
  174. package/schemas/session-replay/mobile/_common-wireframe-schema.json +38 -0
  175. package/schemas/session-replay/mobile/_common-wireframe-update-schema.json +38 -0
  176. package/schemas/session-replay/mobile/full-snapshot-record-schema.json +38 -0
  177. package/schemas/session-replay/mobile/image-wireframe-schema.json +43 -0
  178. package/schemas/session-replay/mobile/image-wireframe-update-schema.json +43 -0
  179. package/schemas/session-replay/mobile/incremental-data-schema.json +21 -0
  180. package/schemas/session-replay/mobile/incremental-snapshot-record-schema.json +26 -0
  181. package/schemas/session-replay/mobile/mutation-data-schema.json +23 -0
  182. package/schemas/session-replay/mobile/mutation-payload-schema.json +55 -0
  183. package/schemas/session-replay/mobile/placeholder-wireframe-schema.json +28 -0
  184. package/schemas/session-replay/mobile/placeholder-wireframe-update-schema.json +28 -0
  185. package/schemas/session-replay/mobile/record-schema.json +27 -0
  186. package/schemas/session-replay/mobile/segment-metadata-schema.json +25 -0
  187. package/schemas/session-replay/mobile/segment-schema.json +25 -0
  188. package/schemas/session-replay/mobile/shape-border-schema.json +25 -0
  189. package/schemas/session-replay/mobile/shape-style-schema.json +29 -0
  190. package/schemas/session-replay/mobile/shape-wireframe-schema.json +23 -0
  191. package/schemas/session-replay/mobile/shape-wireframe-update-schema.json +23 -0
  192. package/schemas/session-replay/mobile/text-position-schema.json +57 -0
  193. package/schemas/session-replay/mobile/text-style-schema.json +31 -0
  194. package/schemas/session-replay/mobile/text-wireframe-schema.json +34 -0
  195. package/schemas/session-replay/mobile/text-wireframe-update-schema.json +34 -0
  196. package/schemas/session-replay/mobile/touch-data-schema.json +51 -0
  197. package/schemas/session-replay/mobile/webview-wireframe-schema.json +33 -0
  198. package/schemas/session-replay/mobile/webview-wireframe-update-schema.json +33 -0
  199. package/schemas/session-replay/mobile/wireframe-clip-schema.json +29 -0
  200. package/schemas/session-replay/mobile/wireframe-schema.json +24 -0
  201. package/schemas/session-replay/mobile/wireframe-update-mutation-schema.json +24 -0
  202. package/schemas/session-replay/mutation-data-schema.json +14 -0
  203. package/schemas/session-replay/mutation-payload-schema.json +14 -0
  204. package/schemas/session-replay/record-schema.json +14 -0
  205. package/schemas/session-replay/segment-metadata-schema.json +14 -0
  206. package/schemas/session-replay/segment-schema.json +15 -0
  207. package/schemas/session-replay-browser-schema.json +5 -0
  208. package/schemas/session-replay-mobile-schema.json +5 -0
  209. package/schemas/session-replay-schema.json +33 -0
  210. package/scripts/generate.mjs +96 -0
  211. package/scripts/utils.mjs +16 -0
  212. package/scripts/validate.mjs +144 -0
  213. package/tsconfig.cjs.json +7 -0
  214. package/tsconfig.esm.json +7 -0
  215. package/tsconfig.json +13 -0
  216. 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
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "module": "CommonJS",
5
+ "outDir": "lib/cjs"
6
+ }
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "module": "ES6",
5
+ "outDir": "lib/esm"
6
+ }
7
+ }
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
+ }