@memberjunction/codegen-lib 6.1.0-edge.5 → 6.1.0-edge.7
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/README.md +20 -0
- package/dist/Angular/angular-codegen.d.ts +9 -6
- package/dist/Angular/angular-codegen.d.ts.map +1 -1
- package/dist/Angular/angular-codegen.js +80 -51
- package/dist/Angular/angular-codegen.js.map +1 -1
- package/dist/Angular/join-grid-related-entity-component.d.ts.map +1 -1
- package/dist/Angular/join-grid-related-entity-component.js +5 -2
- package/dist/Angular/join-grid-related-entity-component.js.map +1 -1
- package/dist/Angular/related-entity-components.d.ts +11 -0
- package/dist/Angular/related-entity-components.d.ts.map +1 -1
- package/dist/Angular/related-entity-components.js +23 -0
- package/dist/Angular/related-entity-components.js.map +1 -1
- package/dist/Angular/timeline-related-entity-component.d.ts.map +1 -1
- package/dist/Angular/timeline-related-entity-component.js +3 -2
- package/dist/Angular/timeline-related-entity-component.js.map +1 -1
- package/dist/Config/config.d.ts +29 -2
- package/dist/Config/config.d.ts.map +1 -1
- package/dist/Config/config.js +54 -5
- package/dist/Config/config.js.map +1 -1
- package/dist/Database/codeGenDatabaseProvider.d.ts +64 -1
- package/dist/Database/codeGenDatabaseProvider.d.ts.map +1 -1
- package/dist/Database/codeGenDatabaseProvider.js +49 -3
- package/dist/Database/codeGenDatabaseProvider.js.map +1 -1
- package/dist/Database/dbSchema.js +2 -1
- package/dist/Database/dbSchema.js.map +1 -1
- package/dist/Database/entity-field-change-tracking.d.ts +53 -0
- package/dist/Database/entity-field-change-tracking.d.ts.map +1 -0
- package/dist/Database/entity-field-change-tracking.js +120 -0
- package/dist/Database/entity-field-change-tracking.js.map +1 -0
- package/dist/Database/entity-level-tree-cycles.d.ts.map +1 -1
- package/dist/Database/entity-level-tree-cycles.js +3 -2
- package/dist/Database/entity-level-tree-cycles.js.map +1 -1
- package/dist/Database/field-metadata-lock.d.ts +47 -0
- package/dist/Database/field-metadata-lock.d.ts.map +1 -0
- package/dist/Database/field-metadata-lock.js +159 -0
- package/dist/Database/field-metadata-lock.js.map +1 -0
- package/dist/Database/manage-metadata.d.ts +133 -51
- package/dist/Database/manage-metadata.d.ts.map +1 -1
- package/dist/Database/manage-metadata.js +574 -306
- package/dist/Database/manage-metadata.js.map +1 -1
- package/dist/Database/providers/postgresql/PostgreSQLCodeGenProvider.d.ts +10 -2
- package/dist/Database/providers/postgresql/PostgreSQLCodeGenProvider.d.ts.map +1 -1
- package/dist/Database/providers/postgresql/PostgreSQLCodeGenProvider.js +113 -42
- package/dist/Database/providers/postgresql/PostgreSQLCodeGenProvider.js.map +1 -1
- package/dist/Database/providers/postgresql/metadataSupportObjects.js +31 -8
- package/dist/Database/providers/postgresql/metadataSupportObjects.js.map +1 -1
- package/dist/Database/providers/sqlserver/SQLServerCodeGenProvider.d.ts +47 -2
- package/dist/Database/providers/sqlserver/SQLServerCodeGenProvider.d.ts.map +1 -1
- package/dist/Database/providers/sqlserver/SQLServerCodeGenProvider.js +176 -30
- package/dist/Database/providers/sqlserver/SQLServerCodeGenProvider.js.map +1 -1
- package/dist/Database/providers/sqlserver/__tests__/BaseViewEmissionGoldenMaster.test.js +15 -2
- package/dist/Database/providers/sqlserver/__tests__/BaseViewEmissionGoldenMaster.test.js.map +1 -1
- package/dist/Database/reconcileFieldLevelSecurity.d.ts +22 -0
- package/dist/Database/reconcileFieldLevelSecurity.d.ts.map +1 -0
- package/dist/Database/reconcileFieldLevelSecurity.js +47 -0
- package/dist/Database/reconcileFieldLevelSecurity.js.map +1 -0
- package/dist/Database/sql_codegen.d.ts +34 -0
- package/dist/Database/sql_codegen.d.ts.map +1 -1
- package/dist/Database/sql_codegen.js +152 -14
- package/dist/Database/sql_codegen.js.map +1 -1
- package/dist/Manifest/GenerateClassRegistrationsManifest.d.ts.map +1 -1
- package/dist/Manifest/GenerateClassRegistrationsManifest.js +3 -2
- package/dist/Manifest/GenerateClassRegistrationsManifest.js.map +1 -1
- package/dist/Misc/action_subclasses_codegen.js +2 -2
- package/dist/Misc/action_subclasses_codegen.js.map +1 -1
- package/dist/Misc/advanced_generation.d.ts +17 -5
- package/dist/Misc/advanced_generation.d.ts.map +1 -1
- package/dist/Misc/advanced_generation.js +69 -23
- package/dist/Misc/advanced_generation.js.map +1 -1
- package/dist/Misc/codegen-reporter.d.ts +2 -0
- package/dist/Misc/codegen-reporter.d.ts.map +1 -1
- package/dist/Misc/codegen-reporter.js +6 -2
- package/dist/Misc/codegen-reporter.js.map +1 -1
- package/dist/Misc/entity_subclasses_codegen.d.ts.map +1 -1
- package/dist/Misc/entity_subclasses_codegen.js +30 -20
- package/dist/Misc/entity_subclasses_codegen.js.map +1 -1
- package/dist/Misc/graphql_server_codegen.d.ts +39 -0
- package/dist/Misc/graphql_server_codegen.d.ts.map +1 -1
- package/dist/Misc/graphql_server_codegen.js +63 -9
- package/dist/Misc/graphql_server_codegen.js.map +1 -1
- package/dist/Misc/remote_operations_codegen.d.ts +36 -1
- package/dist/Misc/remote_operations_codegen.d.ts.map +1 -1
- package/dist/Misc/remote_operations_codegen.js +178 -8
- package/dist/Misc/remote_operations_codegen.js.map +1 -1
- package/dist/Misc/schema-emit.d.ts.map +1 -1
- package/dist/Misc/schema-emit.js +2 -1
- package/dist/Misc/schema-emit.js.map +1 -1
- package/dist/Misc/sql_logging.d.ts +63 -8
- package/dist/Misc/sql_logging.d.ts.map +1 -1
- package/dist/Misc/sql_logging.js +169 -42
- package/dist/Misc/sql_logging.js.map +1 -1
- package/dist/Misc/util.d.ts +12 -0
- package/dist/Misc/util.d.ts.map +1 -1
- package/dist/Misc/util.js +71 -8
- package/dist/Misc/util.js.map +1 -1
- package/dist/plugins/index.d.ts +3 -0
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +28 -1
- package/dist/plugins/index.js.map +1 -1
- package/dist/runCodeGen.d.ts.map +1 -1
- package/dist/runCodeGen.js +134 -26
- package/dist/runCodeGen.js.map +1 -1
- package/package.json +29 -29
|
@@ -1,10 +1,39 @@
|
|
|
1
1
|
import { CodeGenConnection } from '../Database/codeGenDatabaseProvider.js';
|
|
2
|
+
/**
|
|
3
|
+
* True when `folderPath` is the CodeGenLib / MJ-host default (`./migrations/v5` etc.),
|
|
4
|
+
* not an Open App `migrations/codegen` tree.
|
|
5
|
+
*/
|
|
6
|
+
export declare function isMjDefaultSqlOutputPath(folderPath: string): boolean;
|
|
7
|
+
export type ResolveSQLOutputFolderArgs = {
|
|
8
|
+
cwd: string;
|
|
9
|
+
configuredFolderPath?: string;
|
|
10
|
+
includeSchemas?: string[];
|
|
11
|
+
coreSchema: string;
|
|
12
|
+
/** CLI `--sql-output-dir`. Wins over config when set. */
|
|
13
|
+
sqlOutputDirFlag?: string;
|
|
14
|
+
hasMjAppJson: boolean;
|
|
15
|
+
isMjMonorepo: boolean;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Where CodeGen writes `CodeGen_Run_*.sql` (EntityField INSERTs and other metadata SQL).
|
|
19
|
+
*
|
|
20
|
+
* Open App (`mj-app.json` in cwd): always `{cwd}/migrations/codegen` unless
|
|
21
|
+
* `--sql-output-dir` or an explicit non-MJ `SQLOutput.folderPath` is set.
|
|
22
|
+
* Never fall back to `MJ/migrations/v*` — that silently dropped Open App
|
|
23
|
+
* EntityField SQL into the host tree.
|
|
24
|
+
*
|
|
25
|
+
* MJ monorepo cwd + `includeSchemas` listing a non-core schema: throw. Run
|
|
26
|
+
* CodeGen from the app directory.
|
|
27
|
+
*/
|
|
28
|
+
export declare function resolveSQLOutputFolder(args: ResolveSQLOutputFolderArgs): string;
|
|
2
29
|
/**
|
|
3
30
|
* Utility class for logging SQL to a run file that can be fresh for each run or appended to depending on the settings in the configuration
|
|
4
31
|
*/
|
|
5
32
|
export declare class SQLLogging {
|
|
6
33
|
private static _SQLLoggingFilePath;
|
|
7
34
|
private static _OmitRecurringScriptsFromLog;
|
|
35
|
+
/** CLI `--sql-output-dir`. Set before {@link initSQLLogging}. */
|
|
36
|
+
static sqlOutputDirFlag: string | undefined;
|
|
8
37
|
static get SQLLoggingFilePath(): string;
|
|
9
38
|
static get OmitRecurringScriptsFromLog(): boolean;
|
|
10
39
|
/**
|
|
@@ -33,17 +62,35 @@ export declare class SQLLogging {
|
|
|
33
62
|
*/
|
|
34
63
|
static redirectToPGMigrations(folderPath: string): string;
|
|
35
64
|
static initSQLLogging(): void;
|
|
36
|
-
static finishSQLLogging(): void;
|
|
37
|
-
protected static createFileName(): string;
|
|
38
65
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
|
|
43
|
-
|
|
66
|
+
* The batch separator for the active platform: `GO` on SQL Server, none on PostgreSQL. Used as the
|
|
67
|
+
* default for callers that do not pass the provider's separator, so a PostgreSQL capture can never
|
|
68
|
+
* pick up a literal `GO` from a forgotten argument.
|
|
69
|
+
*/
|
|
70
|
+
static defaultBatchSeparator(): string;
|
|
71
|
+
/** Test hook — SQLLogging is a process-wide singleton. */
|
|
72
|
+
static resetForTests(): void;
|
|
73
|
+
/** Test hook — sets the active capture file path for testing. */
|
|
74
|
+
static setFilePathForTesting(filePath: string): void;
|
|
75
|
+
/**
|
|
76
|
+
* Test hook — turns SQL capture off for the process: disables `SQLOutput` so
|
|
77
|
+
* {@link LogSQLAndExecute} does not refuse to run against a stub connection with no CodeGen_Run
|
|
78
|
+
* file open, and closes any capture file already open so nothing is written meanwhile. Returns a
|
|
79
|
+
* function that restores both; call it from `afterAll`.
|
|
44
80
|
*/
|
|
81
|
+
static suppressOutputForTests(): () => void;
|
|
82
|
+
static finishSQLLogging(): void;
|
|
83
|
+
protected static createFileName(): string;
|
|
45
84
|
/**
|
|
46
|
-
* Adds the provided SQL to the log file for the run
|
|
85
|
+
* Adds the provided SQL to the log file for the run.
|
|
86
|
+
*
|
|
87
|
+
* Two rules keep the file replayable as a migration. A unit that declares a batch-scoped T-SQL
|
|
88
|
+
* variable always ends its batch: every unit is executed as its own query, so no later unit can
|
|
89
|
+
* depend on the variable, but two such units concatenated into one migration batch fail replay
|
|
90
|
+
* with "The variable name '@x' has already been declared" (see {@link declaresBatchScopedVariable}).
|
|
91
|
+
* And a unit that already ends in `GO` never receives a second separator. An empty
|
|
92
|
+
* `batchSeparator` (PostgreSQL) means none. Callers should still pass `includeBatchSeparator`
|
|
93
|
+
* explicitly: the scan does not see a declaration hidden inside a string or a mid-line statement.
|
|
47
94
|
* @param contents - the executable SQL to log
|
|
48
95
|
* @param description - a description of what is being logged that will be emitted and wrapped in comments
|
|
49
96
|
* @param isRecurringScript - if set to true tells the logger that the provided SQL represents a recurring script meaning it is something that is executed, generally, for all CodeGen runs. In these cases, the Config settings can result in omitting these recurring scripts from being logged because the configuration environment may have those recurring scripts already set to run after all run-specific migrations get run.
|
|
@@ -63,6 +110,14 @@ export declare class SQLLogging {
|
|
|
63
110
|
* @returns - The result of the query execution.
|
|
64
111
|
*/
|
|
65
112
|
static LogSQLAndExecute(ds: CodeGenConnection, query: string, description?: string, isRecurringScript?: boolean, includeBatchSeparator?: boolean, batchSeparator?: string): Promise<any>;
|
|
113
|
+
/**
|
|
114
|
+
* True when the SQL text declares a batch-scoped T-SQL local variable: a `DECLARE @name ...` at the
|
|
115
|
+
* start of any line with no routine header (`CREATE|ALTER [OR ALTER] PROCEDURE|FUNCTION|TRIGGER`) before
|
|
116
|
+
* it. T-SQL variables are scoped to the batch wherever they are declared — after `SET NOCOUNT ON`,
|
|
117
|
+
* inside `IF ... BEGIN ... END` — so the match is not limited to the first statement. A declaration
|
|
118
|
+
* inside a routine body is routine-scoped and cannot collide across units, so it does not count.
|
|
119
|
+
*/
|
|
120
|
+
static declaresBatchScopedVariable(sql: string): boolean;
|
|
66
121
|
protected static getFileLength(filePath: string): number;
|
|
67
122
|
protected static convertSQLLogToFlywaySchema(): void;
|
|
68
123
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql_logging.d.ts","sourceRoot":"","sources":["../../src/Misc/sql_logging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"sql_logging.d.ts","sourceRoot":"","sources":["../../src/Misc/sql_logging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAQxE;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAGpE;AAED,MAAM,MAAM,0BAA0B,GAAG;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,0BAA0B,GAAG,MAAM,CAoC/E;AAED;;GAEG;AACH,qBAAa,UAAU;IACnB,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAc;IAChD,OAAO,CAAC,MAAM,CAAC,4BAA4B,CAAiB;IAC5D,iEAAiE;IACjE,OAAc,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IAEnD,WAAkB,kBAAkB,IAAI,MAAM,CAE7C;IACD,WAAkB,2BAA2B,IAAI,OAAO,CAEvD;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;WACW,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;WAwBlD,cAAc;IA4C5B;;;;OAIG;WACW,qBAAqB,IAAI,MAAM;IAI7C,0DAA0D;WAC5C,aAAa,IAAI,IAAI;IAKnC,iEAAiE;WACnD,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI3D;;;;;OAKG;WACW,sBAAsB,IAAI,MAAM,IAAI;WAgBnC,gBAAgB;IAa9B,SAAS,CAAC,MAAM,CAAC,cAAc,IAAI,MAAM;IAe1C;;;;;;;;;;;;;;;;OAgBG;WACiB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,iBAAiB,GAAE,OAAe,EAAE,qBAAqB,GAAE,OAAe,EAAE,cAAc,GAAE,MAA2C,GAAG,OAAO,CAAC,IAAI,CAAC;IAsDtO;;;;;;;;;MASE;WACkB,gBAAgB,CAAC,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,iBAAiB,GAAE,OAAe,EAAE,qBAAqB,GAAE,OAAe,EAAE,cAAc,GAAE,MAA2C,GAAG,OAAO,CAAC,GAAG,CAAC;IAYvP;;;;;;OAMG;WACW,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAsB/D,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAUxD,SAAS,CAAC,MAAM,CAAC,2BAA2B,IAAI,IAAI;IAyBnD;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;CAG9B"}
|
package/dist/Misc/sql_logging.js
CHANGED
|
@@ -1,13 +1,62 @@
|
|
|
1
|
-
import { configInfo, mj_core_schema, dbPlatform } from "../Config/config.js";
|
|
1
|
+
import { configInfo, mj_core_schema, dbPlatform, currentWorkingDirectory } from "../Config/config.js";
|
|
2
2
|
import { logError, logStatus } from "./status_logging.js";
|
|
3
3
|
import * as fs from 'fs';
|
|
4
4
|
import path from 'path';
|
|
5
|
+
const MJ_DEFAULT_SQL_OUTPUT_RE = /(^|\/|\\)migrations[/\\]v\d+[/\\]?$/i;
|
|
6
|
+
/**
|
|
7
|
+
* True when `folderPath` is the CodeGenLib / MJ-host default (`./migrations/v5` etc.),
|
|
8
|
+
* not an Open App `migrations/codegen` tree.
|
|
9
|
+
*/
|
|
10
|
+
export function isMjDefaultSqlOutputPath(folderPath) {
|
|
11
|
+
const n = folderPath.replace(/\\/g, '/').replace(/\/+$/, '');
|
|
12
|
+
return MJ_DEFAULT_SQL_OUTPUT_RE.test(n) || n === './migrations/v5' || n === '../../migrations/v5';
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Where CodeGen writes `CodeGen_Run_*.sql` (EntityField INSERTs and other metadata SQL).
|
|
16
|
+
*
|
|
17
|
+
* Open App (`mj-app.json` in cwd): always `{cwd}/migrations/codegen` unless
|
|
18
|
+
* `--sql-output-dir` or an explicit non-MJ `SQLOutput.folderPath` is set.
|
|
19
|
+
* Never fall back to `MJ/migrations/v*` — that silently dropped Open App
|
|
20
|
+
* EntityField SQL into the host tree.
|
|
21
|
+
*
|
|
22
|
+
* MJ monorepo cwd + `includeSchemas` listing a non-core schema: throw. Run
|
|
23
|
+
* CodeGen from the app directory.
|
|
24
|
+
*/
|
|
25
|
+
export function resolveSQLOutputFolder(args) {
|
|
26
|
+
const cwd = path.resolve(args.cwd);
|
|
27
|
+
const core = (args.coreSchema || '__mj').toLowerCase();
|
|
28
|
+
const include = (args.includeSchemas ?? []).map(s => s.toLowerCase());
|
|
29
|
+
const generatingAppSchemas = include.some(s => s !== core);
|
|
30
|
+
if (args.sqlOutputDirFlag) {
|
|
31
|
+
const resolved = path.resolve(cwd, args.sqlOutputDirFlag);
|
|
32
|
+
if (args.hasMjAppJson && isMjDefaultSqlOutputPath(resolved)) {
|
|
33
|
+
throw new Error(`CodeGen --sql-output-dir resolves to an MJ host migrations tree (${resolved}). ` +
|
|
34
|
+
`Open App metadata SQL must go to the app's migrations/codegen. ` +
|
|
35
|
+
`Run from the app cwd (mj-app.json) without this flag, or pass the app codegen folder.`);
|
|
36
|
+
}
|
|
37
|
+
return resolved;
|
|
38
|
+
}
|
|
39
|
+
if (args.hasMjAppJson) {
|
|
40
|
+
const configured = args.configuredFolderPath;
|
|
41
|
+
if (configured && !isMjDefaultSqlOutputPath(configured)) {
|
|
42
|
+
return path.resolve(cwd, configured);
|
|
43
|
+
}
|
|
44
|
+
return path.join(cwd, 'migrations', 'codegen');
|
|
45
|
+
}
|
|
46
|
+
if (args.isMjMonorepo && generatingAppSchemas) {
|
|
47
|
+
throw new Error(`CodeGen SQLOutput would write Open App metadata SQL into the MJ repo (${cwd}). ` +
|
|
48
|
+
`Run \`mj codegen\` from the Open App directory (a cwd that contains mj-app.json), not from MJ. ` +
|
|
49
|
+
`includeSchemas=${(args.includeSchemas ?? []).join(',') || '(empty)'}`);
|
|
50
|
+
}
|
|
51
|
+
const folder = args.configuredFolderPath ?? './migrations/v5/';
|
|
52
|
+
return path.resolve(cwd, folder);
|
|
53
|
+
}
|
|
5
54
|
/**
|
|
6
55
|
* Utility class for logging SQL to a run file that can be fresh for each run or appended to depending on the settings in the configuration
|
|
7
56
|
*/
|
|
8
57
|
export class SQLLogging {
|
|
9
58
|
static { this._SQLLoggingFilePath = ''; }
|
|
10
|
-
static { this._OmitRecurringScriptsFromLog =
|
|
59
|
+
static { this._OmitRecurringScriptsFromLog = true; }
|
|
11
60
|
static get SQLLoggingFilePath() {
|
|
12
61
|
return SQLLogging._SQLLoggingFilePath;
|
|
13
62
|
}
|
|
@@ -62,40 +111,77 @@ export class SQLLogging {
|
|
|
62
111
|
return folderPath;
|
|
63
112
|
}
|
|
64
113
|
static initSQLLogging() {
|
|
65
|
-
|
|
114
|
+
const config = configInfo.SQLOutput;
|
|
115
|
+
if (!config) {
|
|
116
|
+
throw new Error("SQLOutput config is required to enable metadata logging");
|
|
117
|
+
}
|
|
118
|
+
SQLLogging._OmitRecurringScriptsFromLog = config.omitRecurringScriptsFromLog;
|
|
66
119
|
if (!SQLLogging.SQLLoggingFilePath) {
|
|
67
|
-
|
|
68
|
-
const config = configInfo.SQLOutput;
|
|
69
|
-
if (!config) {
|
|
70
|
-
logError("MetadataLoggingConfig is required to enable metadata logging");
|
|
120
|
+
if (!config.enabled)
|
|
71
121
|
return;
|
|
122
|
+
const cwd = currentWorkingDirectory || process.cwd();
|
|
123
|
+
const coreSchema = mj_core_schema();
|
|
124
|
+
let folderPath = resolveSQLOutputFolder({
|
|
125
|
+
cwd,
|
|
126
|
+
configuredFolderPath: config.folderPath,
|
|
127
|
+
includeSchemas: configInfo.includeSchemas,
|
|
128
|
+
coreSchema,
|
|
129
|
+
sqlOutputDirFlag: SQLLogging.sqlOutputDirFlag,
|
|
130
|
+
hasMjAppJson: fs.existsSync(path.join(cwd, 'mj-app.json')),
|
|
131
|
+
isMjMonorepo: fs.existsSync(path.join(cwd, 'packages', 'CodeGenLib')) ||
|
|
132
|
+
fs.existsSync(path.join(cwd, 'packages', 'MJCLI')),
|
|
133
|
+
});
|
|
134
|
+
if (dbPlatform() === 'postgresql') {
|
|
135
|
+
folderPath = SQLLogging.redirectToPGMigrations(folderPath);
|
|
72
136
|
}
|
|
73
|
-
if (!
|
|
74
|
-
|
|
75
|
-
if (config.folderPath) {
|
|
76
|
-
// On PostgreSQL, redirect the migrations root so CodeGen audit SQL lands in
|
|
77
|
-
// migrations-pg/ alongside the rest of the PG tooling.
|
|
78
|
-
let folderPath = config.folderPath;
|
|
79
|
-
if (dbPlatform() === 'postgresql') {
|
|
80
|
-
folderPath = SQLLogging.redirectToPGMigrations(folderPath);
|
|
81
|
-
}
|
|
82
|
-
const dirExists = fs.existsSync(folderPath);
|
|
83
|
-
if (!dirExists) {
|
|
84
|
-
fs.mkdirSync(folderPath, { recursive: true });
|
|
85
|
-
}
|
|
86
|
-
const fileName = config.fileName || this.createFileName();
|
|
87
|
-
SQLLogging._SQLLoggingFilePath = path.join(folderPath, fileName);
|
|
88
|
-
if (!config.appendToFile || !fs.existsSync(SQLLogging.SQLLoggingFilePath)) {
|
|
89
|
-
//create an empty file
|
|
90
|
-
fs.writeFileSync(SQLLogging.SQLLoggingFilePath, '');
|
|
91
|
-
}
|
|
92
|
-
logStatus(`Metadata logging enabled. File path: ${SQLLogging.SQLLoggingFilePath}`);
|
|
137
|
+
if (!fs.existsSync(folderPath)) {
|
|
138
|
+
fs.mkdirSync(folderPath, { recursive: true });
|
|
93
139
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
140
|
+
const fileName = config.fileName || this.createFileName();
|
|
141
|
+
SQLLogging._SQLLoggingFilePath = path.join(folderPath, fileName);
|
|
142
|
+
if (!config.appendToFile || !fs.existsSync(SQLLogging.SQLLoggingFilePath)) {
|
|
143
|
+
fs.writeFileSync(SQLLogging.SQLLoggingFilePath, '');
|
|
97
144
|
}
|
|
145
|
+
logStatus(`Metadata logging enabled. File path: ${SQLLogging.SQLLoggingFilePath}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* The batch separator for the active platform: `GO` on SQL Server, none on PostgreSQL. Used as the
|
|
150
|
+
* default for callers that do not pass the provider's separator, so a PostgreSQL capture can never
|
|
151
|
+
* pick up a literal `GO` from a forgotten argument.
|
|
152
|
+
*/
|
|
153
|
+
static defaultBatchSeparator() {
|
|
154
|
+
return dbPlatform() === 'postgresql' ? '' : 'GO';
|
|
155
|
+
}
|
|
156
|
+
/** Test hook — SQLLogging is a process-wide singleton. */
|
|
157
|
+
static resetForTests() {
|
|
158
|
+
SQLLogging._SQLLoggingFilePath = '';
|
|
159
|
+
SQLLogging.sqlOutputDirFlag = undefined;
|
|
160
|
+
}
|
|
161
|
+
/** Test hook — sets the active capture file path for testing. */
|
|
162
|
+
static setFilePathForTesting(filePath) {
|
|
163
|
+
SQLLogging._SQLLoggingFilePath = filePath;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Test hook — turns SQL capture off for the process: disables `SQLOutput` so
|
|
167
|
+
* {@link LogSQLAndExecute} does not refuse to run against a stub connection with no CodeGen_Run
|
|
168
|
+
* file open, and closes any capture file already open so nothing is written meanwhile. Returns a
|
|
169
|
+
* function that restores both; call it from `afterAll`.
|
|
170
|
+
*/
|
|
171
|
+
static suppressOutputForTests() {
|
|
172
|
+
const output = configInfo.SQLOutput;
|
|
173
|
+
const previousEnabled = output?.enabled;
|
|
174
|
+
const previousPath = SQLLogging._SQLLoggingFilePath;
|
|
175
|
+
if (output) {
|
|
176
|
+
output.enabled = false;
|
|
98
177
|
}
|
|
178
|
+
SQLLogging._SQLLoggingFilePath = '';
|
|
179
|
+
return () => {
|
|
180
|
+
if (output && previousEnabled !== undefined) {
|
|
181
|
+
output.enabled = previousEnabled;
|
|
182
|
+
}
|
|
183
|
+
SQLLogging._SQLLoggingFilePath = previousPath;
|
|
184
|
+
};
|
|
99
185
|
}
|
|
100
186
|
static finishSQLLogging() {
|
|
101
187
|
if (SQLLogging.SQLLoggingFilePath) {
|
|
@@ -121,14 +207,15 @@ export class SQLLogging {
|
|
|
121
207
|
return fileName;
|
|
122
208
|
}
|
|
123
209
|
/**
|
|
124
|
-
* Adds the provided SQL to the log file for the run
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
*
|
|
210
|
+
* Adds the provided SQL to the log file for the run.
|
|
211
|
+
*
|
|
212
|
+
* Two rules keep the file replayable as a migration. A unit that declares a batch-scoped T-SQL
|
|
213
|
+
* variable always ends its batch: every unit is executed as its own query, so no later unit can
|
|
214
|
+
* depend on the variable, but two such units concatenated into one migration batch fail replay
|
|
215
|
+
* with "The variable name '@x' has already been declared" (see {@link declaresBatchScopedVariable}).
|
|
216
|
+
* And a unit that already ends in `GO` never receives a second separator. An empty
|
|
217
|
+
* `batchSeparator` (PostgreSQL) means none. Callers should still pass `includeBatchSeparator`
|
|
218
|
+
* explicitly: the scan does not see a declaration hidden inside a string or a mid-line statement.
|
|
132
219
|
* @param contents - the executable SQL to log
|
|
133
220
|
* @param description - a description of what is being logged that will be emitted and wrapped in comments
|
|
134
221
|
* @param isRecurringScript - if set to true tells the logger that the provided SQL represents a recurring script meaning it is something that is executed, generally, for all CodeGen runs. In these cases, the Config settings can result in omitting these recurring scripts from being logged because the configuration environment may have those recurring scripts already set to run after all run-specific migrations get run.
|
|
@@ -136,7 +223,7 @@ export class SQLLogging {
|
|
|
136
223
|
* @param batchSeparator - the batch separator string to use (e.g., 'GO' for SQL Server). Only used when includeBatchSeparator is true.
|
|
137
224
|
* @returns
|
|
138
225
|
*/
|
|
139
|
-
static async appendToSQLLogFile(contents, description, isRecurringScript = false, includeBatchSeparator = false, batchSeparator =
|
|
226
|
+
static async appendToSQLLogFile(contents, description, isRecurringScript = false, includeBatchSeparator = false, batchSeparator = SQLLogging.defaultBatchSeparator()) {
|
|
140
227
|
try {
|
|
141
228
|
if (isRecurringScript && SQLLogging.OmitRecurringScriptsFromLog) {
|
|
142
229
|
return; // is a recurring script and the flag to omit recurring scripts is set
|
|
@@ -164,11 +251,19 @@ export class SQLLogging {
|
|
|
164
251
|
// ending in `GO`. Appending `;` produces `GO;`, which SSMS and sqlcmd reject
|
|
165
252
|
// ("Incorrect syntax near ';'"). Detect and skip the `;` append in that case.
|
|
166
253
|
const trimmed = contents.replace(/[\s;]+$/g, '');
|
|
254
|
+
let endsWithBatchSeparator = false;
|
|
167
255
|
if (trimmed.length > 0) {
|
|
168
|
-
|
|
256
|
+
endsWithBatchSeparator = /(^|\n)\s*GO\s*$/i.test(trimmed);
|
|
169
257
|
contents = endsWithBatchSeparator ? trimmed : `${trimmed};`;
|
|
170
258
|
}
|
|
171
|
-
|
|
259
|
+
// Emit a separator when the caller asked for one, or when the unit declares a batch-scoped
|
|
260
|
+
// variable (see the method JSDoc). Never for an empty separator (PostgreSQL), and never
|
|
261
|
+
// after a unit that already closes its own batch. The declaration scan runs only on
|
|
262
|
+
// units that could receive a separator, so GO-terminated view and routine bodies — the
|
|
263
|
+
// largest units logged — are not scanned.
|
|
264
|
+
const emitSeparator = !!batchSeparator && !endsWithBatchSeparator &&
|
|
265
|
+
(includeBatchSeparator || SQLLogging.declaresBatchScopedVariable(trimmed));
|
|
266
|
+
contents = emitSeparator
|
|
172
267
|
? `${contents}\n${batchSeparator}\n\n`
|
|
173
268
|
: `${contents}\n\n`;
|
|
174
269
|
fs.appendFileSync(SQLLogging.SQLLoggingFilePath, contents);
|
|
@@ -187,11 +282,43 @@ export class SQLLogging {
|
|
|
187
282
|
* @param isRecurringScript - if set to true tells the logger that the provided SQL represents a recurring script meaning it is something that is executed, generally, for all CodeGen runs. In these cases, the Config settings can result in omitting these recurring scripts from being logged because the configuration environment may have those recurring scripts already set to run after all run-specific migrations get run.
|
|
188
283
|
* @returns - The result of the query execution.
|
|
189
284
|
*/
|
|
190
|
-
static async LogSQLAndExecute(ds, query, description, isRecurringScript = false, includeBatchSeparator = false, batchSeparator =
|
|
285
|
+
static async LogSQLAndExecute(ds, query, description, isRecurringScript = false, includeBatchSeparator = false, batchSeparator = SQLLogging.defaultBatchSeparator()) {
|
|
286
|
+
if (configInfo.SQLOutput?.enabled && !SQLLogging.SQLLoggingFilePath) {
|
|
287
|
+
throw new Error('SQLOutput.enabled but no CodeGen_Run log file is open. Refusing to apply metadata SQL with no artifact. ' +
|
|
288
|
+
'Run `mj codegen` from the Open App directory (mj-app.json) or pass --sql-output-dir.');
|
|
289
|
+
}
|
|
191
290
|
SQLLogging.appendToSQLLogFile(query, description, isRecurringScript, includeBatchSeparator, batchSeparator);
|
|
192
291
|
const result = await ds.query(query);
|
|
193
292
|
return result.recordset;
|
|
194
293
|
}
|
|
294
|
+
/**
|
|
295
|
+
* True when the SQL text declares a batch-scoped T-SQL local variable: a `DECLARE @name ...` at the
|
|
296
|
+
* start of any line with no routine header (`CREATE|ALTER [OR ALTER] PROCEDURE|FUNCTION|TRIGGER`) before
|
|
297
|
+
* it. T-SQL variables are scoped to the batch wherever they are declared — after `SET NOCOUNT ON`,
|
|
298
|
+
* inside `IF ... BEGIN ... END` — so the match is not limited to the first statement. A declaration
|
|
299
|
+
* inside a routine body is routine-scoped and cannot collide across units, so it does not count.
|
|
300
|
+
*/
|
|
301
|
+
static declaresBatchScopedVariable(sql) {
|
|
302
|
+
if (!sql) {
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
// `[ \t]*` rather than `\s*` so the multiline anchors cannot walk across blank lines.
|
|
306
|
+
const declaration = /^[ \t]*DECLARE\s+@/im;
|
|
307
|
+
const routineHeader = /^[ \t]*(CREATE\s+(OR\s+ALTER\s+)?|ALTER\s+)(PROC|PROCEDURE|FUNCTION|TRIGGER)\b/im;
|
|
308
|
+
// A routine body ends at its GO, so judge each batch of the unit on its own: a DECLARE after a
|
|
309
|
+
// routine's GO is batch-scoped again.
|
|
310
|
+
for (const batch of sql.split(/^[ \t]*GO[ \t]*$/im)) {
|
|
311
|
+
const declAt = batch.search(declaration);
|
|
312
|
+
if (declAt === -1) {
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
const headerAt = batch.search(routineHeader);
|
|
316
|
+
if (headerAt === -1 || declAt < headerAt) {
|
|
317
|
+
return true;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
195
322
|
static getFileLength(filePath) {
|
|
196
323
|
try {
|
|
197
324
|
const stats = fs.statSync(filePath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql_logging.js","sourceRoot":"","sources":["../../src/Misc/sql_logging.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAmB,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"sql_logging.js","sourceRoot":"","sources":["../../src/Misc/sql_logging.ts"],"names":[],"mappings":"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"}
|
package/dist/Misc/util.d.ts
CHANGED
|
@@ -55,4 +55,16 @@ export declare function sortRelatedEntities<T extends {
|
|
|
55
55
|
RelatedEntityJoinField?: string;
|
|
56
56
|
ID?: string;
|
|
57
57
|
}>(items: T[]): T[];
|
|
58
|
+
/**
|
|
59
|
+
* Serializes a value to JSON with recursively sorted object keys, ensuring deterministic
|
|
60
|
+
* string representations across runs regardless of property insertion order.
|
|
61
|
+
*
|
|
62
|
+
* @param value - Value to serialize
|
|
63
|
+
* @param space - Optional indentation (e.g. 2 for pretty-printed JSON)
|
|
64
|
+
*/
|
|
65
|
+
export declare function canonicalJSONStringify(value: unknown, space?: number | string): string;
|
|
66
|
+
/**
|
|
67
|
+
* Deep structural equality comparison for JSON-serializable objects and primitives.
|
|
68
|
+
*/
|
|
69
|
+
export declare function deepEqualJSON(a: unknown, b: unknown): boolean;
|
|
58
70
|
//# sourceMappingURL=util.d.ts.map
|
package/dist/Misc/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/Misc/util.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/Misc/util.ts"],"names":[],"mappings":"AAOA,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAI1C;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAI7C;AAED,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,QAQzD;AAED,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB9G;AAEH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,OAAO,GAAG,IAAI,CAiC/H;AAGD;;;GAGG;AACH,wBAAgB,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,QAIvD;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,SAAS;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAiC9L;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAyBhL;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAEtF;AAkBD;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAyB7D"}
|
package/dist/Misc/util.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { logError } from "./status_logging.js";
|
|
2
|
+
import { ordinalCompare } from "@memberjunction/global";
|
|
2
3
|
import fs, { unlinkSync } from "fs";
|
|
3
4
|
import fsExtra from 'fs-extra';
|
|
4
5
|
import { globSync } from 'glob';
|
|
@@ -63,7 +64,7 @@ export function combineFiles(directory, combinedFileName, pattern, overwriteExis
|
|
|
63
64
|
return -1;
|
|
64
65
|
}
|
|
65
66
|
else {
|
|
66
|
-
return a
|
|
67
|
+
return ordinalCompare(a, b);
|
|
67
68
|
}
|
|
68
69
|
});
|
|
69
70
|
let combinedContent = '';
|
|
@@ -114,7 +115,7 @@ export function sortBySequenceAndCreatedAt(items) {
|
|
|
114
115
|
// Alphabetical tiebreakers — try type-appropriate name fields in order
|
|
115
116
|
// Value (EntityFieldValueInfo)
|
|
116
117
|
if (a.Value != null && b.Value != null) {
|
|
117
|
-
const cmp = a.Value
|
|
118
|
+
const cmp = ordinalCompare(a.Value, b.Value);
|
|
118
119
|
if (cmp !== 0)
|
|
119
120
|
return cmp;
|
|
120
121
|
}
|
|
@@ -124,19 +125,19 @@ export function sortBySequenceAndCreatedAt(items) {
|
|
|
124
125
|
return 1;
|
|
125
126
|
// Name (EntityFieldInfo)
|
|
126
127
|
if (a.Name != null && b.Name != null) {
|
|
127
|
-
const cmp = a.Name
|
|
128
|
+
const cmp = ordinalCompare(a.Name, b.Name);
|
|
128
129
|
if (cmp !== 0)
|
|
129
130
|
return cmp;
|
|
130
131
|
}
|
|
131
132
|
// RelatedEntityJoinField (EntityRelationshipInfo)
|
|
132
133
|
if (a.RelatedEntityJoinField != null && b.RelatedEntityJoinField != null) {
|
|
133
|
-
const cmp = a.RelatedEntityJoinField
|
|
134
|
+
const cmp = ordinalCompare(a.RelatedEntityJoinField, b.RelatedEntityJoinField);
|
|
134
135
|
if (cmp !== 0)
|
|
135
136
|
return cmp;
|
|
136
137
|
}
|
|
137
138
|
// Last resort: sort by ID for absolute determinism
|
|
138
139
|
if (a.ID != null && b.ID != null) {
|
|
139
|
-
return a.ID
|
|
140
|
+
return ordinalCompare(a.ID, b.ID);
|
|
140
141
|
}
|
|
141
142
|
return 0;
|
|
142
143
|
});
|
|
@@ -159,21 +160,83 @@ export function sortRelatedEntities(items) {
|
|
|
159
160
|
}
|
|
160
161
|
// Tiebreaker: RelatedEntity name (the display name of the related entity)
|
|
161
162
|
if (a.RelatedEntity != null && b.RelatedEntity != null) {
|
|
162
|
-
const cmp = a.RelatedEntity
|
|
163
|
+
const cmp = ordinalCompare(a.RelatedEntity, b.RelatedEntity);
|
|
163
164
|
if (cmp !== 0)
|
|
164
165
|
return cmp;
|
|
165
166
|
}
|
|
166
167
|
// Tiebreaker: RelatedEntityJoinField (FK column name)
|
|
167
168
|
if (a.RelatedEntityJoinField != null && b.RelatedEntityJoinField != null) {
|
|
168
|
-
const cmp = a.RelatedEntityJoinField
|
|
169
|
+
const cmp = ordinalCompare(a.RelatedEntityJoinField, b.RelatedEntityJoinField);
|
|
169
170
|
if (cmp !== 0)
|
|
170
171
|
return cmp;
|
|
171
172
|
}
|
|
172
173
|
// Last resort: ID
|
|
173
174
|
if (a.ID != null && b.ID != null) {
|
|
174
|
-
return a.ID
|
|
175
|
+
return ordinalCompare(a.ID, b.ID);
|
|
175
176
|
}
|
|
176
177
|
return 0;
|
|
177
178
|
});
|
|
178
179
|
}
|
|
180
|
+
/**
|
|
181
|
+
* Serializes a value to JSON with recursively sorted object keys, ensuring deterministic
|
|
182
|
+
* string representations across runs regardless of property insertion order.
|
|
183
|
+
*
|
|
184
|
+
* @param value - Value to serialize
|
|
185
|
+
* @param space - Optional indentation (e.g. 2 for pretty-printed JSON)
|
|
186
|
+
*/
|
|
187
|
+
export function canonicalJSONStringify(value, space) {
|
|
188
|
+
return JSON.stringify(sortKeysRecursively(value), null, space);
|
|
189
|
+
}
|
|
190
|
+
function sortKeysRecursively(value) {
|
|
191
|
+
if (value === null || typeof value !== 'object') {
|
|
192
|
+
return value;
|
|
193
|
+
}
|
|
194
|
+
if (Array.isArray(value)) {
|
|
195
|
+
return value.map(sortKeysRecursively);
|
|
196
|
+
}
|
|
197
|
+
const obj = value;
|
|
198
|
+
const sortedKeys = Object.keys(obj).sort(ordinalCompare);
|
|
199
|
+
const result = {};
|
|
200
|
+
for (const key of sortedKeys) {
|
|
201
|
+
result[key] = sortKeysRecursively(obj[key]);
|
|
202
|
+
}
|
|
203
|
+
return result;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Deep structural equality comparison for JSON-serializable objects and primitives.
|
|
207
|
+
*/
|
|
208
|
+
export function deepEqualJSON(a, b) {
|
|
209
|
+
if (a === b)
|
|
210
|
+
return true;
|
|
211
|
+
if (a == null || b == null)
|
|
212
|
+
return false;
|
|
213
|
+
if (typeof a !== typeof b)
|
|
214
|
+
return false;
|
|
215
|
+
if (typeof a !== 'object')
|
|
216
|
+
return false;
|
|
217
|
+
if (Array.isArray(a) !== Array.isArray(b))
|
|
218
|
+
return false;
|
|
219
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
|
220
|
+
if (a.length !== b.length)
|
|
221
|
+
return false;
|
|
222
|
+
for (let i = 0; i < a.length; i++) {
|
|
223
|
+
if (!deepEqualJSON(a[i], b[i]))
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
const objA = a;
|
|
229
|
+
const objB = b;
|
|
230
|
+
const keysA = Object.keys(objA);
|
|
231
|
+
const keysB = Object.keys(objB);
|
|
232
|
+
if (keysA.length !== keysB.length)
|
|
233
|
+
return false;
|
|
234
|
+
for (const key of keysA) {
|
|
235
|
+
if (!Object.prototype.hasOwnProperty.call(objB, key))
|
|
236
|
+
return false;
|
|
237
|
+
if (!deepEqualJSON(objA[key], objB[key]))
|
|
238
|
+
return false;
|
|
239
|
+
}
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
179
242
|
//# sourceMappingURL=util.js.map
|
package/dist/Misc/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/Misc/util.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/Misc/util.ts"],"names":[],"mappings":"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"}
|
package/dist/plugins/index.d.ts
CHANGED
|
@@ -21,6 +21,9 @@ export declare class CodeGenPlugin extends BaseCLIPlugin {
|
|
|
21
21
|
skipdb: Interfaces.BooleanFlag<boolean>;
|
|
22
22
|
skipfiles: Interfaces.BooleanFlag<boolean>;
|
|
23
23
|
'force-advanced-gen': Interfaces.BooleanFlag<boolean>;
|
|
24
|
+
'no-ai': Interfaces.BooleanFlag<boolean>;
|
|
25
|
+
'sql-output-dir': Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
|
|
26
|
+
'skip-commands': Interfaces.BooleanFlag<boolean>;
|
|
24
27
|
};
|
|
25
28
|
static Usage: PluginUsage;
|
|
26
29
|
protected Execute(): Promise<MJCLIResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAS,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAU7F,qBACa,aAAc,SAAQ,aAAa;IAC9C,MAAM,CAAC,WAAW,SAQqD;IAEvE,MAAM,CAAC,QAAQ;;;QAIb;IAEF,MAAM,CAAC,KAAK
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAS,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAU7F,qBACa,aAAc,SAAQ,aAAa;IAC9C,MAAM,CAAC,WAAW,SAQqD;IAEvE,MAAM,CAAC,QAAQ;;;QAIb;IAEF,MAAM,CAAC,KAAK;;;;;;;MAqBV;IAEF,MAAM,CAAC,KAAK,EAAE,WAAW,CAiBvB;cAEc,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC;IAkD/C;;;OAGG;cACa,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAG5D;AAED,gFAAgF;AAChF,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}
|