@servicenow/sdk-build-core 2.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.
Files changed (130) hide show
  1. package/dist/BuildOptions.d.ts +50 -0
  2. package/dist/BuildOptions.js +46 -0
  3. package/dist/BuildOptions.js.map +1 -0
  4. package/dist/GUID.d.ts +2 -0
  5. package/dist/GUID.js +48 -0
  6. package/dist/GUID.js.map +1 -0
  7. package/dist/Keys.d.ts +29 -0
  8. package/dist/Keys.js +258 -0
  9. package/dist/Keys.js.map +1 -0
  10. package/dist/TypeScript.d.ts +5 -0
  11. package/dist/TypeScript.js +81 -0
  12. package/dist/TypeScript.js.map +1 -0
  13. package/dist/XML.d.ts +25 -0
  14. package/dist/XML.js +72 -0
  15. package/dist/XML.js.map +1 -0
  16. package/dist/index.d.ts +8 -0
  17. package/dist/index.js +38 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/plugins/Context.d.ts +198 -0
  20. package/dist/plugins/Context.js +3 -0
  21. package/dist/plugins/Context.js.map +1 -0
  22. package/dist/plugins/Diagnostic.d.ts +10 -0
  23. package/dist/plugins/Diagnostic.js +52 -0
  24. package/dist/plugins/Diagnostic.js.map +1 -0
  25. package/dist/plugins/Plugin.d.ts +175 -0
  26. package/dist/plugins/Plugin.js +15 -0
  27. package/dist/plugins/Plugin.js.map +1 -0
  28. package/dist/plugins/behaviors/Arranger.d.ts +26 -0
  29. package/dist/plugins/behaviors/Arranger.js +3 -0
  30. package/dist/plugins/behaviors/Arranger.js.map +1 -0
  31. package/dist/plugins/behaviors/Composer.d.ts +101 -0
  32. package/dist/plugins/behaviors/Composer.js +15 -0
  33. package/dist/plugins/behaviors/Composer.js.map +1 -0
  34. package/dist/plugins/behaviors/Diagnostics.d.ts +8 -0
  35. package/dist/plugins/behaviors/Diagnostics.js +3 -0
  36. package/dist/plugins/behaviors/Diagnostics.js.map +1 -0
  37. package/dist/plugins/behaviors/Generator.d.ts +21 -0
  38. package/dist/plugins/behaviors/Generator.js +3 -0
  39. package/dist/plugins/behaviors/Generator.js.map +1 -0
  40. package/dist/plugins/behaviors/OwnedTables.d.ts +6 -0
  41. package/dist/plugins/behaviors/OwnedTables.js +3 -0
  42. package/dist/plugins/behaviors/OwnedTables.js.map +1 -0
  43. package/dist/plugins/behaviors/PostProcessor.d.ts +5 -0
  44. package/dist/plugins/behaviors/PostProcessor.js +3 -0
  45. package/dist/plugins/behaviors/PostProcessor.js.map +1 -0
  46. package/dist/plugins/behaviors/Serializer.d.ts +29 -0
  47. package/dist/plugins/behaviors/Serializer.js +3 -0
  48. package/dist/plugins/behaviors/Serializer.js.map +1 -0
  49. package/dist/plugins/behaviors/Transformer.d.ts +23 -0
  50. package/dist/plugins/behaviors/Transformer.js +3 -0
  51. package/dist/plugins/behaviors/Transformer.js.map +1 -0
  52. package/dist/plugins/behaviors/extractors/Data.d.ts +107 -0
  53. package/dist/plugins/behaviors/extractors/Data.js +191 -0
  54. package/dist/plugins/behaviors/extractors/Data.js.map +1 -0
  55. package/dist/plugins/behaviors/extractors/Extractors.d.ts +41 -0
  56. package/dist/plugins/behaviors/extractors/Extractors.js +3 -0
  57. package/dist/plugins/behaviors/extractors/Extractors.js.map +1 -0
  58. package/dist/plugins/behaviors/extractors/index.d.ts +2 -0
  59. package/dist/plugins/behaviors/extractors/index.js +19 -0
  60. package/dist/plugins/behaviors/extractors/index.js.map +1 -0
  61. package/dist/plugins/behaviors/index.d.ts +9 -0
  62. package/dist/plugins/behaviors/index.js +26 -0
  63. package/dist/plugins/behaviors/index.js.map +1 -0
  64. package/dist/plugins/index.d.ts +5 -0
  65. package/dist/plugins/index.js +23 -0
  66. package/dist/plugins/index.js.map +1 -0
  67. package/dist/plugins/util/CallExpression.d.ts +6 -0
  68. package/dist/plugins/util/CallExpression.js +93 -0
  69. package/dist/plugins/util/CallExpression.js.map +1 -0
  70. package/dist/plugins/util/CodeTransformation.d.ts +74 -0
  71. package/dist/plugins/util/CodeTransformation.js +421 -0
  72. package/dist/plugins/util/CodeTransformation.js.map +1 -0
  73. package/dist/plugins/util/ConfigurationFunction.d.ts +106 -0
  74. package/dist/plugins/util/ConfigurationFunction.js +377 -0
  75. package/dist/plugins/util/ConfigurationFunction.js.map +1 -0
  76. package/dist/plugins/util/ObjectLiteral.d.ts +9 -0
  77. package/dist/plugins/util/ObjectLiteral.js +60 -0
  78. package/dist/plugins/util/ObjectLiteral.js.map +1 -0
  79. package/dist/plugins/util/index.d.ts +4 -0
  80. package/dist/plugins/util/index.js +21 -0
  81. package/dist/plugins/util/index.js.map +1 -0
  82. package/dist/util/Debug.d.ts +8 -0
  83. package/dist/util/Debug.js +39 -0
  84. package/dist/util/Debug.js.map +1 -0
  85. package/dist/util/Util.d.ts +4 -0
  86. package/dist/util/Util.js +41 -0
  87. package/dist/util/Util.js.map +1 -0
  88. package/dist/util/XMLJsonBuilder.d.ts +18 -0
  89. package/dist/util/XMLJsonBuilder.js +59 -0
  90. package/dist/util/XMLJsonBuilder.js.map +1 -0
  91. package/dist/util/XMLUploadParser.d.ts +22 -0
  92. package/dist/util/XMLUploadParser.js +67 -0
  93. package/dist/util/XMLUploadParser.js.map +1 -0
  94. package/dist/util/index.d.ts +4 -0
  95. package/dist/util/index.js +21 -0
  96. package/dist/util/index.js.map +1 -0
  97. package/license +9 -0
  98. package/package.json +42 -0
  99. package/src/BuildOptions.ts +27 -0
  100. package/src/GUID.ts +26 -0
  101. package/src/Keys.ts +287 -0
  102. package/src/TypeScript.ts +65 -0
  103. package/src/XML.ts +85 -0
  104. package/src/index.ts +8 -0
  105. package/src/plugins/Context.ts +249 -0
  106. package/src/plugins/Diagnostic.ts +31 -0
  107. package/src/plugins/Plugin.ts +246 -0
  108. package/src/plugins/behaviors/Arranger.ts +42 -0
  109. package/src/plugins/behaviors/Composer.ts +124 -0
  110. package/src/plugins/behaviors/Diagnostics.ts +13 -0
  111. package/src/plugins/behaviors/Generator.ts +31 -0
  112. package/src/plugins/behaviors/OwnedTables.ts +5 -0
  113. package/src/plugins/behaviors/PostProcessor.ts +6 -0
  114. package/src/plugins/behaviors/Serializer.ts +39 -0
  115. package/src/plugins/behaviors/Transformer.ts +32 -0
  116. package/src/plugins/behaviors/extractors/Data.ts +247 -0
  117. package/src/plugins/behaviors/extractors/Extractors.ts +57 -0
  118. package/src/plugins/behaviors/extractors/index.ts +2 -0
  119. package/src/plugins/behaviors/index.ts +9 -0
  120. package/src/plugins/index.ts +5 -0
  121. package/src/plugins/util/CallExpression.ts +83 -0
  122. package/src/plugins/util/CodeTransformation.ts +500 -0
  123. package/src/plugins/util/ConfigurationFunction.ts +477 -0
  124. package/src/plugins/util/ObjectLiteral.ts +37 -0
  125. package/src/plugins/util/index.ts +4 -0
  126. package/src/util/Debug.ts +46 -0
  127. package/src/util/Util.ts +21 -0
  128. package/src/util/XMLJsonBuilder.ts +64 -0
  129. package/src/util/XMLUploadParser.ts +90 -0
  130. package/src/util/index.ts +4 -0
@@ -0,0 +1,50 @@
1
+ import * as z from 'zod';
2
+ declare const BuildOptionsSchema: z.ZodIntersection<z.ZodObject<{
3
+ mode: z.ZodString;
4
+ release: z.ZodDefault<z.ZodString>;
5
+ debug: z.ZodDefault<z.ZodBoolean>;
6
+ dontSaveFiles: z.ZodDefault<z.ZodBoolean>;
7
+ }, "strip", z.ZodTypeAny, {
8
+ mode: string;
9
+ release: string;
10
+ debug: boolean;
11
+ dontSaveFiles: boolean;
12
+ }, {
13
+ mode: string;
14
+ release?: string | undefined;
15
+ debug?: boolean | undefined;
16
+ dontSaveFiles?: boolean | undefined;
17
+ }>, z.ZodUnion<[z.ZodObject<{
18
+ mode: z.ZodLiteral<"serialize">;
19
+ }, "strip", z.ZodTypeAny, {
20
+ mode: "serialize";
21
+ }, {
22
+ mode: "serialize";
23
+ }>, z.ZodObject<{
24
+ mode: z.ZodLiteral<"transform">;
25
+ clean: z.ZodDefault<z.ZodBoolean>;
26
+ transformDirectory: z.ZodDefault<z.ZodString>;
27
+ }, "strip", z.ZodTypeAny, {
28
+ mode: "transform";
29
+ clean: boolean;
30
+ transformDirectory: string;
31
+ }, {
32
+ mode: "transform";
33
+ clean?: boolean | undefined;
34
+ transformDirectory?: string | undefined;
35
+ }>]>>;
36
+ export type BuildOptionsInput = z.input<typeof BuildOptionsSchema>;
37
+ export type BuildOptions = z.output<typeof BuildOptionsSchema>;
38
+ export declare const parseBuildOptions: (data: unknown, params?: Partial<z.ParseParams>) => {
39
+ mode: string;
40
+ release: string;
41
+ debug: boolean;
42
+ dontSaveFiles: boolean;
43
+ } & ({
44
+ mode: "serialize";
45
+ } | {
46
+ mode: "transform";
47
+ clean: boolean;
48
+ transformDirectory: string;
49
+ });
50
+ export {};
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.parseBuildOptions = void 0;
27
+ const path = __importStar(require("path"));
28
+ const z = __importStar(require("zod"));
29
+ const BuildOptionsSchema = z
30
+ .object({
31
+ mode: z.string(),
32
+ release: z.string().default('default'),
33
+ debug: z.boolean().default(false),
34
+ dontSaveFiles: z.boolean().default(false),
35
+ })
36
+ .and(z
37
+ .object({
38
+ mode: z.literal('serialize'),
39
+ })
40
+ .or(z.object({
41
+ mode: z.literal('transform'),
42
+ clean: z.boolean().default(false),
43
+ transformDirectory: z.string().default(path.resolve(process.cwd(), 'incoming')),
44
+ })));
45
+ exports.parseBuildOptions = BuildOptionsSchema.parse;
46
+ //# sourceMappingURL=BuildOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuildOptions.js","sourceRoot":"","sources":["../src/BuildOptions.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA4B;AAC5B,uCAAwB;AAExB,MAAM,kBAAkB,GAAG,CAAC;KACvB,MAAM,CAAC;IACJ,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IACtC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACjC,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CAC5C,CAAC;KACD,GAAG,CACA,CAAC;KACI,MAAM,CAAC;IACJ,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;CAC/B,CAAC;KACD,EAAE,CACC,CAAC,CAAC,MAAM,CAAC;IACL,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACjC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;CAClF,CAAC,CACL,CACR,CAAA;AAIQ,QAAA,iBAAiB,GAAG,kBAAkB,CAAC,KAAK,CAAA"}
package/dist/GUID.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function GUID(...parts: unknown[]): string;
2
+ export declare function isGUID(guid: string | number): guid is string;
package/dist/GUID.js ADDED
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.GUID = GUID;
27
+ exports.isGUID = isGUID;
28
+ const crypto = __importStar(require("crypto"));
29
+ const HASH_ALGORITHM = 'md5';
30
+ const HASH_DIGEST = 'hex';
31
+ const HASH_SEPARATOR = ':';
32
+ function GUID(...parts) {
33
+ if (parts.length === 0) {
34
+ return crypto.randomUUID().replaceAll('-', '');
35
+ }
36
+ const hash = crypto.createHash(HASH_ALGORITHM);
37
+ hash.update(parts.join(HASH_SEPARATOR));
38
+ return hash.digest(HASH_DIGEST);
39
+ }
40
+ // Matches a hex string exactly 32 characters long
41
+ const snIDRegex = /^[a-f0-9]{32}$/i;
42
+ function isGUID(guid) {
43
+ if (typeof guid !== 'string') {
44
+ return false;
45
+ }
46
+ return snIDRegex.test(guid);
47
+ }
48
+ //# sourceMappingURL=GUID.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GUID.js","sourceRoot":"","sources":["../src/GUID.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAMA,oBAQC;AAKD,wBAMC;AAzBD,+CAAgC;AAEhC,MAAM,cAAc,GAAG,KAAK,CAAA;AAC5B,MAAM,WAAW,GAAG,KAAK,CAAA;AACzB,MAAM,cAAc,GAAG,GAAG,CAAA;AAE1B,SAAgB,IAAI,CAAC,GAAG,KAAgB;IACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IAClD,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;IAC9C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAA;IACvC,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;AACnC,CAAC;AAED,kDAAkD;AAClD,MAAM,SAAS,GAAG,iBAAiB,CAAA;AAEnC,SAAgB,MAAM,CAAC,IAAqB;IACxC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAA;IAChB,CAAC;IAED,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC/B,CAAC"}
package/dist/Keys.d.ts ADDED
@@ -0,0 +1,29 @@
1
+ import { SourceFile } from 'ts-morph';
2
+ import { Context } from './plugins';
3
+ export declare const KEYS_MODULE = "@servicenow/sdk/global";
4
+ export declare const KEYS_FILE_NAME = "keys.ts";
5
+ export declare class Keys implements Now.Internal.KeysRegistry {
6
+ private readonly keys;
7
+ private readonly usedIds;
8
+ constructor(context: Context);
9
+ private static parseKeysFile;
10
+ private static getKeysFile;
11
+ static getKeysFilePath(context: Context): string;
12
+ private static createKeysFile;
13
+ private static ensureGlobalImport;
14
+ private static getOrCreateKeysInterface;
15
+ private use;
16
+ get explicit(): Record<string | number, Now.Internal.ExplicitKey>;
17
+ get composite(): Now.Internal.CompositeKey[];
18
+ get deleted(): Record<string, string[]>;
19
+ getNextAvailableExplicitKey(): string;
20
+ findExplicitKeyById(id: string): string | undefined;
21
+ registerExplicitId(table: string, key: string | number, sysIdOverride?: string): string;
22
+ registerCompositeId(table: string, key: Record<string, string | number>, sysIdOverride?: string): string;
23
+ getUsedExplicitIds(): {
24
+ [k: string]: Now.Internal.ExplicitKey;
25
+ };
26
+ getUsedCompositeIds(): Now.Internal.CompositeKey[];
27
+ getDeletedAndUnusedIds(): Record<string, string[]>;
28
+ save(context: Context, formatter?: (file: SourceFile) => Promise<void>): Promise<void>;
29
+ }
package/dist/Keys.js ADDED
@@ -0,0 +1,258 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.Keys = exports.KEYS_FILE_NAME = exports.KEYS_MODULE = void 0;
27
+ const ts_morph_1 = require("ts-morph");
28
+ const path = __importStar(require("path"));
29
+ const TypeScript_1 = require("./TypeScript");
30
+ const GUID_1 = require("./GUID");
31
+ const z = __importStar(require("zod"));
32
+ const _ = __importStar(require("lodash"));
33
+ const sdk_project_1 = require("@servicenow/sdk-project");
34
+ exports.KEYS_MODULE = '@servicenow/sdk/global';
35
+ exports.KEYS_FILE_NAME = 'keys.ts';
36
+ const KeysSchema = z.object({
37
+ explicit: z
38
+ .record(z.string().or(z.number()), z.object({
39
+ table: z.string(),
40
+ id: z.string(),
41
+ }))
42
+ .default({}),
43
+ composite: z
44
+ .array(z.object({
45
+ table: z.string(),
46
+ id: z.string(),
47
+ key: z.record(z.string(), z.string().or(z.number())),
48
+ }))
49
+ .default([]),
50
+ deleted: z.record(z.array(z.string())).default({}),
51
+ });
52
+ class Keys {
53
+ keys;
54
+ usedIds = new Set();
55
+ constructor(context) {
56
+ this.keys = Keys.parseKeysFile(context) ?? { explicit: {}, composite: [], deleted: {} };
57
+ }
58
+ static parseKeysFile(context) {
59
+ const keysFile = Keys.getKeysFile(context);
60
+ if (!keysFile) {
61
+ return undefined;
62
+ }
63
+ const keysInterface = Keys.getOrCreateKeysInterface(keysFile);
64
+ return KeysSchema.parse((0, TypeScript_1.parseType)(keysInterface.getType(), keysInterface, (unparsableType) => {
65
+ if (unparsableType.isArray()) {
66
+ return []; // If the keys file doesn't have composite keys, it will be an unparsable array so just return an empty one
67
+ }
68
+ else {
69
+ throw `Unparsable type in keys.ts: ${unparsableType.getText()}`;
70
+ }
71
+ }));
72
+ }
73
+ static getKeysFile(context) {
74
+ const keysFilePath = Keys.getKeysFilePath(context);
75
+ if (!sdk_project_1.FileSystem.existsSync(context.fs, keysFilePath)) {
76
+ // BUG: It shouldn't be necessary to check manually here, but there is a bug in
77
+ // ts-morph where attempting to add a source file that doesn't exist will cause
78
+ // subsequent operations on the parent directory to fail in certain scenarios.
79
+ //
80
+ // Created an issue here: https://github.com/dsherret/ts-morph/issues/1554
81
+ return undefined;
82
+ }
83
+ return context.compiler.addSourceFileAtPathIfExists(keysFilePath);
84
+ }
85
+ static getKeysFilePath(context) {
86
+ return path.resolve(context.app.rootDir, context.app.config.generatedDir, exports.KEYS_FILE_NAME);
87
+ }
88
+ static createKeysFile(context) {
89
+ const keysFilePath = Keys.getKeysFilePath(context);
90
+ const parentDir = path.dirname(keysFilePath);
91
+ context.fs.mkdirSync(parentDir, { recursive: true });
92
+ const keysFile = context.compiler.createSourceFile(keysFilePath, '', {});
93
+ Keys.ensureGlobalImport(keysFile);
94
+ return keysFile;
95
+ }
96
+ static ensureGlobalImport(keysFile) {
97
+ if (!keysFile.getImportDeclaration((i) => i.getModuleSpecifierValue() === exports.KEYS_MODULE)) {
98
+ keysFile.addImportDeclaration({ moduleSpecifier: exports.KEYS_MODULE });
99
+ }
100
+ }
101
+ static getOrCreateKeysInterface(keysFile) {
102
+ const declareGlobal = keysFile.getModule('global') ??
103
+ keysFile.addModule({
104
+ name: 'global',
105
+ declarationKind: ts_morph_1.ModuleDeclarationKind.Global,
106
+ hasDeclareKeyword: true,
107
+ });
108
+ const nowNamespace = declareGlobal.getModule('Now') ??
109
+ declareGlobal.addModule({
110
+ name: 'Now',
111
+ declarationKind: ts_morph_1.ModuleDeclarationKind.Namespace,
112
+ });
113
+ const internalNamespace = nowNamespace.getModule('Internal') ??
114
+ nowNamespace.addModule({
115
+ name: 'Internal',
116
+ });
117
+ return (internalNamespace.getInterface('Keys') ??
118
+ internalNamespace.addInterface({
119
+ name: 'Keys',
120
+ extends: (writer) => {
121
+ writer.write('KeysRegistry');
122
+ },
123
+ }));
124
+ }
125
+ use(id) {
126
+ this.usedIds.add(id);
127
+ return id;
128
+ }
129
+ get explicit() {
130
+ return this.keys.explicit;
131
+ }
132
+ get composite() {
133
+ return this.keys.composite;
134
+ }
135
+ get deleted() {
136
+ return this.keys.deleted;
137
+ }
138
+ getNextAvailableExplicitKey() {
139
+ for (let i = 0;; i++) {
140
+ const key = `generated${i}`;
141
+ if (!this.explicit[key]) {
142
+ return key;
143
+ }
144
+ }
145
+ }
146
+ findExplicitKeyById(id) {
147
+ return Object.entries(this.explicit).find(([, v]) => v.id === id)?.[0];
148
+ }
149
+ registerExplicitId(table, key, sysIdOverride) {
150
+ if ((0, GUID_1.isGUID)(key)) {
151
+ // WARNING:
152
+ //
153
+ // IT IS CRITICAL THAT KEYS ARE NOT REGISTERED FOR THINGS OUTSIDE OF THE APP. IF KEYS ARE
154
+ // REGISTERED FOR THINGS THAT COME FROM THE CORE PLATFORM OR SOME OTHER APP, THERE IS RISK
155
+ // THAT THEY WILL BE DELETED ACCIDENTALLY BY THE CUSTOMER.
156
+ //
157
+ // THIS CHECK IS HERE AS AN EXTRA DEFENSIVE MEASURE TO MAKE SURE EXTERNAL SYS IDS ARE NOT
158
+ // ACCIDENTALLY REGISTERED AS LOCAL KEYS.
159
+ //
160
+ // TODO: We need to come up with a different system for key registration where external
161
+ // keys can be resolved to sys IDs without registering them as local keys.
162
+ return this.use(this.explicit[key]?.id ?? key);
163
+ }
164
+ const existing = this.explicit[key];
165
+ if (existing) {
166
+ if (existing.table !== table) {
167
+ throw `Explicit key '${key}' is already registered for table '${existing.table}', cannot register for table '${table}'`;
168
+ }
169
+ return this.use(existing.id);
170
+ }
171
+ if (sysIdOverride) {
172
+ const existingKey = this.findExplicitKeyById(sysIdOverride);
173
+ if (existingKey) {
174
+ const existingWithSysId = this.explicit[existingKey];
175
+ if (existingWithSysId.table !== table) {
176
+ throw `ID '${sysIdOverride}' is already registered for table '${existingWithSysId.table}', cannot register for table '${table}'`;
177
+ }
178
+ if (existingKey !== key) {
179
+ throw `ID '${sysIdOverride}' is already registered for key '${existingKey}', cannot register for key '${key}'`;
180
+ }
181
+ return this.use(existingWithSysId.id);
182
+ }
183
+ }
184
+ const newKey = {
185
+ table,
186
+ id: (0, GUID_1.isGUID)(key) ? key : sysIdOverride ?? (0, GUID_1.GUID)(),
187
+ };
188
+ this.explicit[key] = newKey;
189
+ return this.use(newKey.id);
190
+ }
191
+ registerCompositeId(table, key, sysIdOverride) {
192
+ const existing = this.composite.find((k) => k.table === table && _.isEqual(k.key, key));
193
+ if (existing) {
194
+ if (existing.table !== table) {
195
+ throw `Composite key ${key} is already registered for table '${existing.table}', cannot register for table '${table}'`;
196
+ }
197
+ return this.use(existing.id);
198
+ }
199
+ const newKey = {
200
+ table,
201
+ id: sysIdOverride ?? (0, GUID_1.GUID)(),
202
+ key,
203
+ };
204
+ this.composite.push(newKey);
205
+ return this.use(newKey.id);
206
+ }
207
+ getUsedExplicitIds() {
208
+ return Object.fromEntries(Object.entries(this.explicit).filter(([, v]) => this.usedIds.has(v.id)));
209
+ }
210
+ getUsedCompositeIds() {
211
+ return this.composite.filter((v) => this.usedIds.has(v.id));
212
+ }
213
+ // TODO: This is called in multiple places and is not very cheap. We should consider optimization options.
214
+ getDeletedAndUnusedIds() {
215
+ return [
216
+ ...Object.values(this.explicit),
217
+ ...this.composite,
218
+ ...Object.entries(this.deleted).flatMap(([k, v]) => v.map((id) => ({ table: k, id }))),
219
+ ]
220
+ .filter((v) => !this.usedIds.has(v.id))
221
+ .reduce((deletedIds, v) => {
222
+ deletedIds[v.table] = [...(deletedIds[v.table] ?? []), v.id];
223
+ return deletedIds;
224
+ }, {});
225
+ }
226
+ async save(context, formatter) {
227
+ const newProperties = [];
228
+ const usedExplicitIds = this.getUsedExplicitIds();
229
+ const usedCompositeIds = this.getUsedCompositeIds();
230
+ const deletedOrUnusedIds = this.getDeletedAndUnusedIds();
231
+ if (Object.keys(usedExplicitIds).length > 0) {
232
+ newProperties.push({
233
+ name: 'explicit',
234
+ type: JSON.stringify(usedExplicitIds, undefined, 4),
235
+ });
236
+ }
237
+ if (usedCompositeIds.length > 0) {
238
+ newProperties.push({
239
+ name: 'composite',
240
+ type: JSON.stringify(usedCompositeIds, undefined, 4),
241
+ });
242
+ }
243
+ if (Object.keys(deletedOrUnusedIds).length > 0) {
244
+ newProperties.push({
245
+ name: 'deleted',
246
+ type: JSON.stringify(deletedOrUnusedIds, undefined, 4),
247
+ });
248
+ }
249
+ const keysFile = Keys.getKeysFile(context) ?? Keys.createKeysFile(context);
250
+ const keysInterface = Keys.getOrCreateKeysInterface(keysFile);
251
+ keysInterface.getProperties().forEach((p) => p.remove());
252
+ keysInterface.addProperties(newProperties);
253
+ await formatter?.(keysFile);
254
+ keysFile.saveSync();
255
+ }
256
+ }
257
+ exports.Keys = Keys;
258
+ //# sourceMappingURL=Keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Keys.js","sourceRoot":"","sources":["../src/Keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import * as ts from 'ts-morph';
2
+ export declare function getValueDeclaration(node: ts.Node): ts.Node<ts.ts.Node>;
3
+ export declare function parseType(type: ts.Type, location: ts.Node, unparsableTypeHandler?: (unparsableType: ts.Type) => unknown): unknown;
4
+ export declare function traverseNode(node: ts.Node, visitor: (node: ts.Node) => void): void;
5
+ export declare function createPropertyIdentifier(name: string): ts.ts.Identifier | ts.ts.StringLiteral;
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.getValueDeclaration = getValueDeclaration;
27
+ exports.parseType = parseType;
28
+ exports.traverseNode = traverseNode;
29
+ exports.createPropertyIdentifier = createPropertyIdentifier;
30
+ const ts = __importStar(require("ts-morph"));
31
+ function getValueDeclaration(node) {
32
+ const symbol = node.getSymbolOrThrow(`Expected identifier to have symbol: ${node.getText()}`);
33
+ const valueDeclaration = getValueDeclarationFromSymbolOrAlias(symbol);
34
+ if (!ts.Node.isShorthandPropertyAssignment(valueDeclaration)) {
35
+ return valueDeclaration;
36
+ }
37
+ const valueSymbol = valueDeclaration.getValueSymbol();
38
+ if (!valueSymbol) {
39
+ throw `Expected value declaration for shorthand property assignment to have value symbol: ${valueDeclaration.getText()}`;
40
+ }
41
+ return getValueDeclarationFromSymbolOrAlias(valueSymbol);
42
+ }
43
+ function getValueDeclarationFromSymbolOrAlias(symbol) {
44
+ const valueDeclaration = symbol.getValueDeclaration() ?? symbol.getAliasedSymbol()?.getValueDeclaration();
45
+ if (!valueDeclaration) {
46
+ throw Error(`No value declaration found for symbol: ${symbol.getName()}`);
47
+ }
48
+ return valueDeclaration;
49
+ }
50
+ function parseType(type, location, unparsableTypeHandler = (unparsableType) => {
51
+ throw `Unparsable type: ${unparsableType.getText()}`;
52
+ }) {
53
+ if (type.isLiteral()) {
54
+ return type.getLiteralValueOrThrow();
55
+ }
56
+ else if (type.isTuple()) {
57
+ return type.getTupleElements().map((e) => parseType(e, location, unparsableTypeHandler));
58
+ }
59
+ else if (type.isObject() && !type.isArray()) {
60
+ return type.getProperties().reduce((result, property) => ({
61
+ ...result,
62
+ [property.getName()]: parseType(property.getTypeAtLocation(location), location, unparsableTypeHandler),
63
+ }), {});
64
+ }
65
+ else {
66
+ return unparsableTypeHandler(type);
67
+ }
68
+ }
69
+ function traverseNode(node, visitor) {
70
+ node.forEachChild((child) => {
71
+ traverseNode(child, visitor);
72
+ });
73
+ visitor(node);
74
+ }
75
+ function createPropertyIdentifier(name) {
76
+ //Test that this is going to be a valid javascript property name (aaa, _aaa, 1, aaa1). If so use as identifier (aaa: ...) or as a string literal property ('1aaa': ...)
77
+ return /^((?!\d)[\w$]+|\d+)$/i.test(name)
78
+ ? ts.ts.factory.createIdentifier(name)
79
+ : ts.ts.factory.createStringLiteral(name);
80
+ }
81
+ //# sourceMappingURL=TypeScript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypeScript.js","sourceRoot":"","sources":["../src/TypeScript.ts"],"names":[],"mappings":"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"}
package/dist/XML.d.ts ADDED
@@ -0,0 +1,25 @@
1
+ import { Action, type Context } from './plugins';
2
+ import { XMLJsonElement } from './util/XMLJsonBuilder';
3
+ export type XmlValue = string | number | boolean;
4
+ export declare function isValidXmlValue(value: unknown): value is XmlValue;
5
+ export declare function unloadBuilder(context: Context): {
6
+ xml: XMLJsonElement;
7
+ end: () => any;
8
+ record: (tableName: string, id: string | number, action?: Action) => {
9
+ fields(fields: Record<string, XmlValue>): void;
10
+ field(columnName: string, value: unknown, attributes?: Record<string, string>): {
11
+ choices(_choices: unknown): void;
12
+ };
13
+ addSysScope(context: Context): XMLJsonElement;
14
+ };
15
+ };
16
+ export declare function recordXml(xml: XMLJsonElement, tableName: string, id: string | number, options?: {
17
+ attr?: Record<string, string>;
18
+ excludeScopeElement?: boolean;
19
+ }): {
20
+ fields(fields: Record<string, XmlValue>): void;
21
+ field(columnName: string, value: unknown, attributes?: Record<string, string>): {
22
+ choices(_choices: unknown): void;
23
+ };
24
+ addSysScope(context: Context): XMLJsonElement;
25
+ };
package/dist/XML.js ADDED
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isValidXmlValue = isValidXmlValue;
4
+ exports.unloadBuilder = unloadBuilder;
5
+ exports.recordXml = recordXml;
6
+ const sdk_metrics_1 = require("@servicenow/sdk-metrics");
7
+ const fast_xml_parser_1 = require("fast-xml-parser");
8
+ const XMLJsonBuilder_1 = require("./util/XMLJsonBuilder");
9
+ function isValidXmlValue(value) {
10
+ return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
11
+ }
12
+ function unloadBuilder(context) {
13
+ const builder = new XMLJsonBuilder_1.XMLJsonBuilder('1.0');
14
+ const xml = builder.createRoot('record_update', undefined, undefined);
15
+ const end = () => new fast_xml_parser_1.XMLBuilder({
16
+ ignoreAttributes: false,
17
+ format: true,
18
+ suppressBooleanAttributes: false,
19
+ suppressEmptyNode: true,
20
+ cdataPropName: '__cdata',
21
+ })
22
+ .build(builder.buildJsonObj())
23
+ .trim();
24
+ // Root Builder
25
+ return {
26
+ xml,
27
+ end,
28
+ record: (tableName, id, action = 'INSERT_OR_UPDATE') => {
29
+ const rec = recordXml(xml, tableName, id, { attr: { action } });
30
+ rec.addSysScope(context);
31
+ return rec;
32
+ },
33
+ };
34
+ }
35
+ function recordXml(xml, tableName, id, options = {}) {
36
+ const recordXml = xml.addJsonObj(tableName, undefined, options.attr || { action: 'INSERT_OR_UPDATE' });
37
+ recordXml.addJsonObj('sys_id', `${id}`, undefined);
38
+ // Record Builder
39
+ return {
40
+ fields(fields) {
41
+ for (const [columnName, value] of Object.entries(fields)) {
42
+ this.field(columnName, value);
43
+ }
44
+ },
45
+ field(columnName, value, attributes = {}) {
46
+ if (!isValidXmlValue(value)) {
47
+ throw new sdk_metrics_1.SdkError(`Invalid XML value for "${columnName}" column: ${value}`, {
48
+ type: 'xml_validation',
49
+ });
50
+ }
51
+ let fieldXml;
52
+ if (columnName === 'script' || columnName === 'operation_script') {
53
+ fieldXml = recordXml.addJsonObj(columnName, value, attributes, true);
54
+ }
55
+ else {
56
+ fieldXml = recordXml.addJsonObj(columnName, `${value}`, attributes);
57
+ }
58
+ // Field Builder
59
+ return {
60
+ choices(_choices) {
61
+ fieldXml; // TODO: Implement
62
+ },
63
+ };
64
+ },
65
+ addSysScope(context) {
66
+ return recordXml.addJsonObj('sys_scope', context.app.config.scopeId, {
67
+ display_value: context.app.config.scope,
68
+ });
69
+ },
70
+ };
71
+ }
72
+ //# sourceMappingURL=XML.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"XML.js","sourceRoot":"","sources":["../src/XML.ts"],"names":[],"mappings":"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"}