@memberjunction/metadata-sync 6.2.0-edge.4 → 6.2.0-edge.5
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 +115 -51
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/RecordProcessor.d.ts +98 -0
- package/dist/lib/RecordProcessor.d.ts.map +1 -1
- package/dist/lib/RecordProcessor.js +424 -22
- package/dist/lib/RecordProcessor.js.map +1 -1
- package/dist/lib/RelatedEntityHandler.d.ts +4 -1
- package/dist/lib/RelatedEntityHandler.d.ts.map +1 -1
- package/dist/lib/RelatedEntityHandler.js +49 -11
- package/dist/lib/RelatedEntityHandler.js.map +1 -1
- package/dist/lib/created-record-key.d.ts +34 -0
- package/dist/lib/created-record-key.d.ts.map +1 -0
- package/dist/lib/created-record-key.js +46 -0
- package/dist/lib/created-record-key.js.map +1 -0
- package/dist/lib/deletion-auditor.d.ts.map +1 -1
- package/dist/lib/deletion-auditor.js +33 -2
- package/dist/lib/deletion-auditor.js.map +1 -1
- package/dist/lib/entity-field-names.d.ts +11 -0
- package/dist/lib/entity-field-names.d.ts.map +1 -0
- package/dist/lib/entity-field-names.js +15 -0
- package/dist/lib/entity-field-names.js.map +1 -0
- package/dist/lib/env-derived-fields.d.ts +23 -0
- package/dist/lib/env-derived-fields.d.ts.map +1 -0
- package/dist/lib/env-derived-fields.js +53 -0
- package/dist/lib/env-derived-fields.js.map +1 -0
- package/dist/lib/env-display.d.ts +54 -0
- package/dist/lib/env-display.d.ts.map +1 -0
- package/dist/lib/env-display.js +156 -0
- package/dist/lib/env-display.js.map +1 -0
- package/dist/lib/env-reference.d.ts +104 -0
- package/dist/lib/env-reference.d.ts.map +1 -0
- package/dist/lib/env-reference.js +241 -0
- package/dist/lib/env-reference.js.map +1 -0
- package/dist/lib/env-sql-redactor.d.ts +74 -0
- package/dist/lib/env-sql-redactor.d.ts.map +1 -0
- package/dist/lib/env-sql-redactor.js +297 -0
- package/dist/lib/env-sql-redactor.js.map +1 -0
- package/dist/lib/existing-record-index.d.ts +70 -0
- package/dist/lib/existing-record-index.d.ts.map +1 -0
- package/dist/lib/existing-record-index.js +158 -0
- package/dist/lib/existing-record-index.js.map +1 -0
- package/dist/lib/ignore-directories.d.ts +10 -0
- package/dist/lib/ignore-directories.d.ts.map +1 -0
- package/dist/lib/ignore-directories.js +12 -0
- package/dist/lib/ignore-directories.js.map +1 -0
- package/dist/lib/json-record-lines.d.ts +17 -0
- package/dist/lib/json-record-lines.d.ts.map +1 -0
- package/dist/lib/json-record-lines.js +170 -0
- package/dist/lib/json-record-lines.js.map +1 -0
- package/dist/lib/json-subproperty-externalization.d.ts.map +1 -1
- package/dist/lib/json-subproperty-externalization.js +3 -1
- package/dist/lib/json-subproperty-externalization.js.map +1 -1
- package/dist/lib/lookup-reference.d.ts +38 -0
- package/dist/lib/lookup-reference.d.ts.map +1 -0
- package/dist/lib/lookup-reference.js +62 -0
- package/dist/lib/lookup-reference.js.map +1 -0
- package/dist/lib/provider-utils.d.ts.map +1 -1
- package/dist/lib/provider-utils.js +2 -4
- package/dist/lib/provider-utils.js.map +1 -1
- package/dist/lib/pull-option-overrides.d.ts +24 -0
- package/dist/lib/pull-option-overrides.d.ts.map +1 -0
- package/dist/lib/pull-option-overrides.js +39 -0
- package/dist/lib/pull-option-overrides.js.map +1 -0
- package/dist/lib/push-directories.d.ts +42 -0
- package/dist/lib/push-directories.d.ts.map +1 -0
- package/dist/lib/push-directories.js +71 -0
- package/dist/lib/push-directories.js.map +1 -0
- package/dist/lib/push-when.d.ts +38 -0
- package/dist/lib/push-when.d.ts.map +1 -0
- package/dist/lib/push-when.js +84 -0
- package/dist/lib/push-when.js.map +1 -0
- package/dist/lib/record-dependency-analyzer.d.ts +2 -0
- package/dist/lib/record-dependency-analyzer.d.ts.map +1 -1
- package/dist/lib/record-dependency-analyzer.js.map +1 -1
- package/dist/lib/record-file-glob.d.ts +11 -0
- package/dist/lib/record-file-glob.d.ts.map +1 -0
- package/dist/lib/record-file-glob.js +10 -0
- package/dist/lib/record-file-glob.js.map +1 -0
- package/dist/lib/reference-parser.d.ts +3 -2
- package/dist/lib/reference-parser.d.ts.map +1 -1
- package/dist/lib/reference-parser.js +27 -27
- package/dist/lib/reference-parser.js.map +1 -1
- package/dist/lib/sync-engine.d.ts +46 -4
- package/dist/lib/sync-engine.d.ts.map +1 -1
- package/dist/lib/sync-engine.js +215 -59
- package/dist/lib/sync-engine.js.map +1 -1
- package/dist/lib/sync-state-manager.d.ts +7 -3
- package/dist/lib/sync-state-manager.d.ts.map +1 -1
- package/dist/lib/sync-state-manager.js +19 -4
- package/dist/lib/sync-state-manager.js.map +1 -1
- package/dist/lib/watch-file-filter.d.ts +31 -0
- package/dist/lib/watch-file-filter.d.ts.map +1 -0
- package/dist/lib/watch-file-filter.js +64 -0
- package/dist/lib/watch-file-filter.js.map +1 -0
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +44 -14
- package/dist/plugins/index.js.map +1 -1
- package/dist/services/PullService.d.ts +41 -1
- package/dist/services/PullService.d.ts.map +1 -1
- package/dist/services/PullService.js +261 -101
- package/dist/services/PullService.js.map +1 -1
- package/dist/services/PushService.d.ts +59 -0
- package/dist/services/PushService.d.ts.map +1 -1
- package/dist/services/PushService.js +435 -173
- package/dist/services/PushService.js.map +1 -1
- package/dist/services/ValidationService.d.ts +43 -8
- package/dist/services/ValidationService.d.ts.map +1 -1
- package/dist/services/ValidationService.js +338 -127
- package/dist/services/ValidationService.js.map +1 -1
- package/dist/services/WatchService.d.ts +26 -0
- package/dist/services/WatchService.d.ts.map +1 -1
- package/dist/services/WatchService.js +210 -75
- package/dist/services/WatchService.js.map +1 -1
- package/dist/types/validation.d.ts +6 -0
- package/dist/types/validation.d.ts.map +1 -1
- package/package.json +17 -16
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Finds existing file records by a database primary key. An `@env:` key value is
|
|
3
|
+
* replaced by its variable (trimmed) for the match, and UUID key fields are compared without case.
|
|
4
|
+
* @module existing-record-index
|
|
5
|
+
*/
|
|
6
|
+
import type { EntityInfo } from '@memberjunction/core';
|
|
7
|
+
import type { RecordData } from './sync-engine.js';
|
|
8
|
+
import { PrimaryKeyValues } from './record-primary-key.js';
|
|
9
|
+
/** A primaryKey field whose `@env:` variable is not set. Never holds a value. */
|
|
10
|
+
export interface UnsetKeyVariable {
|
|
11
|
+
VariableName: string;
|
|
12
|
+
Field: string;
|
|
13
|
+
/** File that holds the record, when known. */
|
|
14
|
+
FilePath?: string;
|
|
15
|
+
}
|
|
16
|
+
/** One existing file record. */
|
|
17
|
+
export interface ExistingRecordEntry {
|
|
18
|
+
Record: RecordData;
|
|
19
|
+
/** File that holds the record, when known. */
|
|
20
|
+
FilePath?: string;
|
|
21
|
+
/** True when the file holds an array of records. */
|
|
22
|
+
InArray?: boolean;
|
|
23
|
+
}
|
|
24
|
+
/** Thrown when a primaryKey `@env:` variable is not set, so pull cannot match the record. */
|
|
25
|
+
export declare class UnsetPrimaryKeyVariableError extends Error {
|
|
26
|
+
readonly Variables: ReadonlyArray<UnsetKeyVariable>;
|
|
27
|
+
/** Entity whose key uses the variables. */
|
|
28
|
+
readonly EntityName: string;
|
|
29
|
+
/** Entity the user pulls, when it differs from `EntityName`. */
|
|
30
|
+
readonly PulledEntityName?: string;
|
|
31
|
+
constructor(entityName: string, variables: ReadonlyArray<UnsetKeyVariable>, pulledEntityName?: string);
|
|
32
|
+
/** The same error with `filePath` on each variable that names no file, and the entity the user pulls. */
|
|
33
|
+
InRecordFile(filePath: string | undefined, pulledEntityName: string): UnsetPrimaryKeyVariableError;
|
|
34
|
+
}
|
|
35
|
+
/** Existing file records, found by the database primary key. The first record wins for a repeated key. */
|
|
36
|
+
export declare class ExistingRecordIndex {
|
|
37
|
+
private readonly uuidFields;
|
|
38
|
+
private readonly env;
|
|
39
|
+
private readonly byKey;
|
|
40
|
+
private readonly unsetVariables;
|
|
41
|
+
private duplicates;
|
|
42
|
+
private constructor();
|
|
43
|
+
/** Indexes the entries. Records without a primaryKey, or with an unset key variable, are not indexed. */
|
|
44
|
+
static Build(entries: ReadonlyArray<ExistingRecordEntry>, entityInfo: EntityInfo | null | undefined, env?: NodeJS.ProcessEnv): ExistingRecordIndex;
|
|
45
|
+
/** The lookup string of a record as the file writes it, for `FileWriteBatch` array updates. */
|
|
46
|
+
static FileLookupOf(record: RecordData): string;
|
|
47
|
+
/** Key variables that are not set. The records that use them are not indexed. */
|
|
48
|
+
get UnsetKeyVariables(): ReadonlyArray<UnsetKeyVariable>;
|
|
49
|
+
/** Number of records whose key repeats an earlier record's key. */
|
|
50
|
+
get DuplicateCount(): number;
|
|
51
|
+
/** @throws UnsetPrimaryKeyVariableError when any key variable is not set */
|
|
52
|
+
ThrowIfUnsetKeyVariables(entityName: string): void;
|
|
53
|
+
/** The existing entry whose resolved key equals the database key, or undefined. */
|
|
54
|
+
Find(databaseKey: PrimaryKeyValues): ExistingRecordEntry | undefined;
|
|
55
|
+
/** The match string of a database key. */
|
|
56
|
+
MatchKey(databaseKey: PrimaryKeyValues): string;
|
|
57
|
+
/** The match string of a file record's key, or null when the key is empty or a key variable is not set. */
|
|
58
|
+
KeyOf(record: RecordData): string | null;
|
|
59
|
+
private add;
|
|
60
|
+
/** A file key value as text: the variable (trimmed) for `@env:`, the value otherwise; null when unusable. */
|
|
61
|
+
private resolve;
|
|
62
|
+
/** Trimmed, as a fixed-width key is padded; UUID fields lowercased. */
|
|
63
|
+
private normalize;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The primary key pull writes: the file's `@env:` value for each field whose variable (trimmed)
|
|
67
|
+
* equals the database value, with UUID fields compared without case; the database value otherwise.
|
|
68
|
+
*/
|
|
69
|
+
export declare function KeepPrimaryKeyEnvReferences(fileKey: Record<string, unknown> | undefined, databaseKey: Record<string, unknown>, entityInfo: EntityInfo | null | undefined, env?: NodeJS.ProcessEnv): Record<string, unknown>;
|
|
70
|
+
//# sourceMappingURL=existing-record-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"existing-record-index.d.ts","sourceRoot":"","sources":["../../src/lib/existing-record-index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAA0B,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGhF,iFAAiF;AACjF,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,gCAAgC;AAChC,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,UAAU,CAAC;IACnB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,6FAA6F;AAC7F,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,SAAgB,SAAS,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAC3D,2CAA2C;IAC3C,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,gEAAgE;IAChE,SAAgB,gBAAgB,CAAC,EAAE,MAAM,CAAC;gBAE9B,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,EAAE,MAAM;IAYrG,yGAAyG;IACzG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,gBAAgB,EAAE,MAAM,GAAG,4BAA4B;CAInG;AAMD,0GAA0G;AAC1G,qBAAa,mBAAmB;IAM5B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG;IANtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0C;IAChE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA0B;IACzD,OAAO,CAAC,UAAU,CAAK;IAEvB,OAAO;IAKP,yGAAyG;IACzG,MAAM,CAAC,KAAK,CACV,OAAO,EAAE,aAAa,CAAC,mBAAmB,CAAC,EAC3C,UAAU,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,EACzC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,mBAAmB;IAQtB,+FAA+F;IAC/F,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IAI/C,iFAAiF;IACjF,IAAI,iBAAiB,IAAI,aAAa,CAAC,gBAAgB,CAAC,CAEvD;IAED,mEAAmE;IACnE,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,4EAA4E;IAC5E,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAMlD,mFAAmF;IACnF,IAAI,CAAC,WAAW,EAAE,gBAAgB,GAAG,mBAAmB,GAAG,SAAS;IAIpE,0CAA0C;IAC1C,QAAQ,CAAC,WAAW,EAAE,gBAAgB,GAAG,MAAM;IAQ/C,2GAA2G;IAC3G,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI;IAgBxC,OAAO,CAAC,GAAG;IA2BX,6GAA6G;IAC7G,OAAO,CAAC,OAAO;IAYf,uEAAuE;IACvE,OAAO,CAAC,SAAS;CAIlB;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC5C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,UAAU,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,EACzC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqBzB"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { CreatePrimaryKeyLookup } from './record-primary-key.js';
|
|
2
|
+
import { ParseEnvReference } from './env-reference.js';
|
|
3
|
+
/** Thrown when a primaryKey `@env:` variable is not set, so pull cannot match the record. */
|
|
4
|
+
export class UnsetPrimaryKeyVariableError extends Error {
|
|
5
|
+
constructor(entityName, variables, pulledEntityName) {
|
|
6
|
+
const details = variables
|
|
7
|
+
.map((v) => `${v.FilePath ? `${v.FilePath}: ` : ''}primaryKey field ${v.Field} uses @env:${v.VariableName}, which is not set`)
|
|
8
|
+
.join('; ');
|
|
9
|
+
const pulled = pulledEntityName && pulledEntityName !== entityName ? pulledEntityName : undefined;
|
|
10
|
+
super(pulled ? `${details}. Set it to pull ${pulled}; the key belongs to ${entityName}.` : `${details}. Set it to pull ${entityName}.`);
|
|
11
|
+
this.name = 'UnsetPrimaryKeyVariableError';
|
|
12
|
+
this.Variables = variables;
|
|
13
|
+
this.EntityName = entityName;
|
|
14
|
+
this.PulledEntityName = pulled;
|
|
15
|
+
}
|
|
16
|
+
/** The same error with `filePath` on each variable that names no file, and the entity the user pulls. */
|
|
17
|
+
InRecordFile(filePath, pulledEntityName) {
|
|
18
|
+
const variables = this.Variables.map((v) => ({ ...v, FilePath: v.FilePath ?? filePath }));
|
|
19
|
+
return new UnsetPrimaryKeyVariableError(this.EntityName, variables, pulledEntityName);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function uuidKeyFields(entityInfo) {
|
|
23
|
+
return new Set((entityInfo?.PrimaryKeys ?? []).filter((pk) => pk.IsUniqueIdentifier).map((pk) => pk.Name));
|
|
24
|
+
}
|
|
25
|
+
/** Existing file records, found by the database primary key. The first record wins for a repeated key. */
|
|
26
|
+
export class ExistingRecordIndex {
|
|
27
|
+
constructor(uuidFields, env) {
|
|
28
|
+
this.uuidFields = uuidFields;
|
|
29
|
+
this.env = env;
|
|
30
|
+
this.byKey = new Map();
|
|
31
|
+
this.unsetVariables = [];
|
|
32
|
+
this.duplicates = 0;
|
|
33
|
+
}
|
|
34
|
+
/** Indexes the entries. Records without a primaryKey, or with an unset key variable, are not indexed. */
|
|
35
|
+
static Build(entries, entityInfo, env = process.env) {
|
|
36
|
+
const index = new ExistingRecordIndex(uuidKeyFields(entityInfo), env);
|
|
37
|
+
for (const entry of entries) {
|
|
38
|
+
index.add(entry);
|
|
39
|
+
}
|
|
40
|
+
return index;
|
|
41
|
+
}
|
|
42
|
+
/** The lookup string of a record as the file writes it, for `FileWriteBatch` array updates. */
|
|
43
|
+
static FileLookupOf(record) {
|
|
44
|
+
return CreatePrimaryKeyLookup(record.primaryKey);
|
|
45
|
+
}
|
|
46
|
+
/** Key variables that are not set. The records that use them are not indexed. */
|
|
47
|
+
get UnsetKeyVariables() {
|
|
48
|
+
return this.unsetVariables;
|
|
49
|
+
}
|
|
50
|
+
/** Number of records whose key repeats an earlier record's key. */
|
|
51
|
+
get DuplicateCount() {
|
|
52
|
+
return this.duplicates;
|
|
53
|
+
}
|
|
54
|
+
/** @throws UnsetPrimaryKeyVariableError when any key variable is not set */
|
|
55
|
+
ThrowIfUnsetKeyVariables(entityName) {
|
|
56
|
+
if (this.unsetVariables.length > 0) {
|
|
57
|
+
throw new UnsetPrimaryKeyVariableError(entityName, this.unsetVariables);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** The existing entry whose resolved key equals the database key, or undefined. */
|
|
61
|
+
Find(databaseKey) {
|
|
62
|
+
return this.byKey.get(this.MatchKey(databaseKey));
|
|
63
|
+
}
|
|
64
|
+
/** The match string of a database key. */
|
|
65
|
+
MatchKey(databaseKey) {
|
|
66
|
+
const normalized = {};
|
|
67
|
+
for (const [field, value] of Object.entries(databaseKey)) {
|
|
68
|
+
normalized[field] = this.normalize(field, String(value));
|
|
69
|
+
}
|
|
70
|
+
return CreatePrimaryKeyLookup(normalized);
|
|
71
|
+
}
|
|
72
|
+
/** The match string of a file record's key, or null when the key is empty or a key variable is not set. */
|
|
73
|
+
KeyOf(record) {
|
|
74
|
+
const primaryKey = record.primaryKey;
|
|
75
|
+
if (!primaryKey || Object.keys(primaryKey).length === 0) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
const normalized = {};
|
|
79
|
+
for (const [field, value] of Object.entries(primaryKey)) {
|
|
80
|
+
const resolved = this.resolve(value);
|
|
81
|
+
if (resolved === null) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
normalized[field] = this.normalize(field, resolved);
|
|
85
|
+
}
|
|
86
|
+
return CreatePrimaryKeyLookup(normalized);
|
|
87
|
+
}
|
|
88
|
+
add(entry) {
|
|
89
|
+
const primaryKey = entry.Record?.primaryKey;
|
|
90
|
+
if (!primaryKey || Object.keys(primaryKey).length === 0) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
let hasUnset = false;
|
|
94
|
+
for (const [field, value] of Object.entries(primaryKey)) {
|
|
95
|
+
const reference = ParseEnvReference(value);
|
|
96
|
+
if (reference && this.env[reference.VariableName] === undefined) {
|
|
97
|
+
this.unsetVariables.push({ VariableName: reference.VariableName, Field: field, FilePath: entry.FilePath });
|
|
98
|
+
hasUnset = true;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (hasUnset) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const key = this.KeyOf(entry.Record);
|
|
105
|
+
if (key === null) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (this.byKey.has(key)) {
|
|
109
|
+
this.duplicates++;
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
this.byKey.set(key, entry);
|
|
113
|
+
}
|
|
114
|
+
/** A file key value as text: the variable (trimmed) for `@env:`, the value otherwise; null when unusable. */
|
|
115
|
+
resolve(value) {
|
|
116
|
+
const reference = ParseEnvReference(value);
|
|
117
|
+
if (reference) {
|
|
118
|
+
const envValue = this.env[reference.VariableName];
|
|
119
|
+
return envValue === undefined ? null : envValue.trim();
|
|
120
|
+
}
|
|
121
|
+
if (value === null || value === undefined) {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
return String(value);
|
|
125
|
+
}
|
|
126
|
+
/** Trimmed, as a fixed-width key is padded; UUID fields lowercased. */
|
|
127
|
+
normalize(field, value) {
|
|
128
|
+
const trimmed = value.trim();
|
|
129
|
+
return this.uuidFields.has(field) ? trimmed.toLowerCase() : trimmed;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* The primary key pull writes: the file's `@env:` value for each field whose variable (trimmed)
|
|
134
|
+
* equals the database value, with UUID fields compared without case; the database value otherwise.
|
|
135
|
+
*/
|
|
136
|
+
export function KeepPrimaryKeyEnvReferences(fileKey, databaseKey, entityInfo, env = process.env) {
|
|
137
|
+
if (!fileKey) {
|
|
138
|
+
return databaseKey;
|
|
139
|
+
}
|
|
140
|
+
const uuidFields = uuidKeyFields(entityInfo);
|
|
141
|
+
const result = { ...databaseKey };
|
|
142
|
+
for (const [field, databaseValue] of Object.entries(databaseKey)) {
|
|
143
|
+
const fileValue = fileKey[field];
|
|
144
|
+
const reference = ParseEnvReference(fileValue);
|
|
145
|
+
const envValue = reference ? env[reference.VariableName] : undefined;
|
|
146
|
+
if (envValue === undefined || databaseValue === null || databaseValue === undefined) {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const fromEnv = envValue.trim();
|
|
150
|
+
const fromDatabase = String(databaseValue).trim();
|
|
151
|
+
const equal = uuidFields.has(field) ? fromEnv.toLowerCase() === fromDatabase.toLowerCase() : fromEnv === fromDatabase;
|
|
152
|
+
if (equal) {
|
|
153
|
+
result[field] = fileValue;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=existing-record-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"existing-record-index.js","sourceRoot":"","sources":["../../src/lib/existing-record-index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,sBAAsB,EAAoB,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAmBpD,6FAA6F;AAC7F,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IAOrD,YAAY,UAAkB,EAAE,SAA0C,EAAE,gBAAyB;QACnG,MAAM,OAAO,GAAG,SAAS;aACtB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,YAAY,oBAAoB,CAAC;aAC7H,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,MAAM,GAAG,gBAAgB,IAAI,gBAAgB,KAAK,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;QAClG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,oBAAoB,MAAM,wBAAwB,UAAU,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,oBAAoB,UAAU,GAAG,CAAC,CAAC;QACxI,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;IACjC,CAAC;IAED,yGAAyG;IACzG,YAAY,CAAC,QAA4B,EAAE,gBAAwB;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC1F,OAAO,IAAI,4BAA4B,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;IACxF,CAAC;CACF;AAED,SAAS,aAAa,CAAC,UAAyC;IAC9D,OAAO,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7G,CAAC;AAED,0GAA0G;AAC1G,MAAM,OAAO,mBAAmB;IAK9B,YACmB,UAA+B,EAC/B,GAAsB;QADtB,eAAU,GAAV,UAAU,CAAqB;QAC/B,QAAG,GAAH,GAAG,CAAmB;QANxB,UAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;QAC/C,mBAAc,GAAuB,EAAE,CAAC;QACjD,eAAU,GAAG,CAAC,CAAC;IAKpB,CAAC;IAEJ,yGAAyG;IACzG,MAAM,CAAC,KAAK,CACV,OAA2C,EAC3C,UAAyC,EACzC,MAAyB,OAAO,CAAC,GAAG;QAEpC,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC;QACtE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,+FAA+F;IAC/F,MAAM,CAAC,YAAY,CAAC,MAAkB;QACpC,OAAO,sBAAsB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC;IAED,iFAAiF;IACjF,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,mEAAmE;IACnE,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,4EAA4E;IAC5E,wBAAwB,CAAC,UAAkB;QACzC,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,4BAA4B,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,mFAAmF;IACnF,IAAI,CAAC,WAA6B;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,0CAA0C;IAC1C,QAAQ,CAAC,WAA6B;QACpC,MAAM,UAAU,GAA2B,EAAE,CAAC;QAC9C,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACzD,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAC5C,CAAC;IAED,2GAA2G;IAC3G,KAAK,CAAC,MAAkB;QACtB,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,UAAU,GAA2B,EAAE,CAAC;QAC9C,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAC5C,CAAC;IAEO,GAAG,CAAC,KAA0B;QACpC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC;QAC5C,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxD,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACxD,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,SAAS,EAAE,CAAC;gBAChE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,SAAS,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC3G,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;QACH,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,6GAA6G;IACrG,OAAO,CAAC,KAAc;QAC5B,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YAClD,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzD,CAAC;QACD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,uEAAuE;IAC/D,SAAS,CAAC,KAAa,EAAE,KAAa;QAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IACtE,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAA4C,EAC5C,WAAoC,EACpC,UAAyC,EACzC,MAAyB,OAAO,CAAC,GAAG;IAEpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,MAAM,GAA4B,EAAE,GAAG,WAAW,EAAE,CAAC;IAC3D,KAAK,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACjE,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrE,IAAI,QAAQ,KAAK,SAAS,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YACpF,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,YAAY,CAAC;QACtH,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview The `ignoreDirectories` name rule shared by push, watch, status and validation.
|
|
3
|
+
* @module ignore-directories
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* True when a directory name equals one of the patterns or ends with it.
|
|
7
|
+
* Used for `ignoreDirectories` by push (and watch, which chooses folders as push does), status and validation.
|
|
8
|
+
*/
|
|
9
|
+
export declare function IsIgnoredDirectoryName(name: string, patterns: readonly string[] | undefined): boolean;
|
|
10
|
+
//# sourceMappingURL=ignore-directories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignore-directories.d.ts","sourceRoot":"","sources":["../../src/lib/ignore-directories.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO,CAErG"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview The `ignoreDirectories` name rule shared by push, watch, status and validation.
|
|
3
|
+
* @module ignore-directories
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* True when a directory name equals one of the patterns or ends with it.
|
|
7
|
+
* Used for `ignoreDirectories` by push (and watch, which chooses folders as push does), status and validation.
|
|
8
|
+
*/
|
|
9
|
+
export function IsIgnoredDirectoryName(name, patterns) {
|
|
10
|
+
return !!patterns && patterns.some((pattern) => name === pattern || name.endsWith(pattern));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=ignore-directories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignore-directories.js","sourceRoot":"","sources":["../../src/lib/ignore-directories.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAE,QAAuC;IAC1F,OAAO,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9F,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Start line numbers of the objects in a JSON text, keyed by the parsed objects.
|
|
3
|
+
* @module json-record-lines
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Maps each object and array in `parsed` to the 1-based line of its opening bracket in `text`.
|
|
7
|
+
* `parsed` must be `JSON.parse(text)`. For a repeated key, the last one is used, as in `JSON.parse`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function MapJsonStartLines(text: string, parsed: unknown): WeakMap<object, number>;
|
|
10
|
+
/**
|
|
11
|
+
* The start line of the record at a push record path (`Entity[1]/Child Entity[0]`) in a record
|
|
12
|
+
* file's text: the top-level item, then `relatedEntities` items. Undefined when the text is not
|
|
13
|
+
* valid JSON, when it uses `@include` (push numbers records after the include is applied, so a raw
|
|
14
|
+
* position can point to another record), or when the path does not lead to a record.
|
|
15
|
+
*/
|
|
16
|
+
export declare function RecordStartLine(text: string, recordPath: string): number | undefined;
|
|
17
|
+
//# sourceMappingURL=json-record-lines.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-record-lines.d.ts","sourceRoot":"","sources":["../../src/lib/json-record-lines.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA8HH;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAIxF;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAwBpF"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Start line numbers of the objects in a JSON text, keyed by the parsed objects.
|
|
3
|
+
* @module json-record-lines
|
|
4
|
+
*/
|
|
5
|
+
/** Reads the positions of the values in a valid JSON text. */
|
|
6
|
+
class JsonPositionScanner {
|
|
7
|
+
constructor(text) {
|
|
8
|
+
this.text = text;
|
|
9
|
+
this.offset = 0;
|
|
10
|
+
this.line = 1;
|
|
11
|
+
}
|
|
12
|
+
ScanDocument() {
|
|
13
|
+
this.skipWhitespace();
|
|
14
|
+
return this.scanValue();
|
|
15
|
+
}
|
|
16
|
+
scanValue() {
|
|
17
|
+
const line = this.line;
|
|
18
|
+
const char = this.text[this.offset];
|
|
19
|
+
if (char === '{') {
|
|
20
|
+
return { Line: line, Members: this.scanObject(), Items: null };
|
|
21
|
+
}
|
|
22
|
+
if (char === '[') {
|
|
23
|
+
return { Line: line, Members: null, Items: this.scanArray() };
|
|
24
|
+
}
|
|
25
|
+
if (char === '"') {
|
|
26
|
+
this.scanString();
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
this.scanLiteral();
|
|
30
|
+
}
|
|
31
|
+
return { Line: line, Members: null, Items: null };
|
|
32
|
+
}
|
|
33
|
+
scanObject() {
|
|
34
|
+
const members = new Map();
|
|
35
|
+
this.offset++;
|
|
36
|
+
this.skipWhitespace();
|
|
37
|
+
while (this.offset < this.text.length && this.text[this.offset] !== '}') {
|
|
38
|
+
const key = this.scanString();
|
|
39
|
+
this.skipWhitespace();
|
|
40
|
+
this.offset++; // ':'
|
|
41
|
+
this.skipWhitespace();
|
|
42
|
+
members.set(key, this.scanValue());
|
|
43
|
+
this.skipWhitespace();
|
|
44
|
+
if (this.text[this.offset] === ',') {
|
|
45
|
+
this.offset++;
|
|
46
|
+
this.skipWhitespace();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
this.offset++;
|
|
50
|
+
return members;
|
|
51
|
+
}
|
|
52
|
+
scanArray() {
|
|
53
|
+
const items = [];
|
|
54
|
+
this.offset++;
|
|
55
|
+
this.skipWhitespace();
|
|
56
|
+
while (this.offset < this.text.length && this.text[this.offset] !== ']') {
|
|
57
|
+
items.push(this.scanValue());
|
|
58
|
+
this.skipWhitespace();
|
|
59
|
+
if (this.text[this.offset] === ',') {
|
|
60
|
+
this.offset++;
|
|
61
|
+
this.skipWhitespace();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
this.offset++;
|
|
65
|
+
return items;
|
|
66
|
+
}
|
|
67
|
+
/** Reads a string token and returns its decoded text. */
|
|
68
|
+
scanString() {
|
|
69
|
+
const start = this.offset;
|
|
70
|
+
this.offset++;
|
|
71
|
+
while (this.offset < this.text.length && this.text[this.offset] !== '"') {
|
|
72
|
+
this.offset += this.text[this.offset] === '\\' ? 2 : 1;
|
|
73
|
+
}
|
|
74
|
+
this.offset++;
|
|
75
|
+
const decoded = JSON.parse(this.text.slice(start, this.offset));
|
|
76
|
+
return typeof decoded === 'string' ? decoded : '';
|
|
77
|
+
}
|
|
78
|
+
/** Reads a number, true, false or null. */
|
|
79
|
+
scanLiteral() {
|
|
80
|
+
while (this.offset < this.text.length && !/[\s,\]}]/.test(this.text[this.offset])) {
|
|
81
|
+
this.offset++;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
skipWhitespace() {
|
|
85
|
+
while (this.offset < this.text.length) {
|
|
86
|
+
const char = this.text[this.offset];
|
|
87
|
+
if (char === '\n') {
|
|
88
|
+
this.line++;
|
|
89
|
+
}
|
|
90
|
+
else if (char !== ' ' && char !== '\t' && char !== '\r') {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
this.offset++;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function mapStartLines(value, position, lines) {
|
|
98
|
+
if (Array.isArray(value)) {
|
|
99
|
+
lines.set(value, position.Line);
|
|
100
|
+
value.forEach((item, index) => {
|
|
101
|
+
const itemPosition = position.Items?.[index];
|
|
102
|
+
if (itemPosition) {
|
|
103
|
+
mapStartLines(item, itemPosition, lines);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
else if (value !== null && typeof value === 'object') {
|
|
108
|
+
lines.set(value, position.Line);
|
|
109
|
+
for (const [key, member] of Object.entries(value)) {
|
|
110
|
+
const memberPosition = position.Members?.get(key);
|
|
111
|
+
if (memberPosition) {
|
|
112
|
+
mapStartLines(member, memberPosition, lines);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Maps each object and array in `parsed` to the 1-based line of its opening bracket in `text`.
|
|
119
|
+
* `parsed` must be `JSON.parse(text)`. For a repeated key, the last one is used, as in `JSON.parse`.
|
|
120
|
+
*/
|
|
121
|
+
export function MapJsonStartLines(text, parsed) {
|
|
122
|
+
const lines = new WeakMap();
|
|
123
|
+
mapStartLines(parsed, new JsonPositionScanner(text).ScanDocument(), lines);
|
|
124
|
+
return lines;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* The start line of the record at a push record path (`Entity[1]/Child Entity[0]`) in a record
|
|
128
|
+
* file's text: the top-level item, then `relatedEntities` items. Undefined when the text is not
|
|
129
|
+
* valid JSON, when it uses `@include` (push numbers records after the include is applied, so a raw
|
|
130
|
+
* position can point to another record), or when the path does not lead to a record.
|
|
131
|
+
*/
|
|
132
|
+
export function RecordStartLine(text, recordPath) {
|
|
133
|
+
if (text.includes('"@include')) {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
const content = text.replace(/^/, '');
|
|
137
|
+
let parsed;
|
|
138
|
+
try {
|
|
139
|
+
parsed = JSON.parse(content);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
const lines = MapJsonStartLines(content, parsed);
|
|
145
|
+
let current = undefined;
|
|
146
|
+
let first = true;
|
|
147
|
+
for (const [, entityName, indexText] of recordPath.matchAll(/(.+?)\[(\d+)\](?:\/|$)/g)) {
|
|
148
|
+
const index = Number(indexText);
|
|
149
|
+
if (first) {
|
|
150
|
+
current = Array.isArray(parsed) ? parsed[index] : index === 0 ? parsed : undefined;
|
|
151
|
+
first = false;
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
current = relatedItem(current, entityName, index);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return current !== null && typeof current === 'object' ? lines.get(current) : undefined;
|
|
158
|
+
}
|
|
159
|
+
function relatedItem(record, entityName, index) {
|
|
160
|
+
if (record === null || typeof record !== 'object' || !('relatedEntities' in record)) {
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
const related = record.relatedEntities;
|
|
164
|
+
if (related === null || typeof related !== 'object') {
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
const items = Reflect.get(related, entityName);
|
|
168
|
+
return Array.isArray(items) ? items[index] : undefined;
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=json-record-lines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-record-lines.js","sourceRoot":"","sources":["../../src/lib/json-record-lines.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-subproperty-externalization.d.ts","sourceRoot":"","sources":["../../src/lib/json-subproperty-externalization.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"json-subproperty-externalization.d.ts","sourceRoot":"","sources":["../../src/lib/json-subproperty-externalization.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,iEAAiE;AACjE,MAAM,WAAW,0BAA0B;IACvC,sEAAsE;IACtE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,6EAA6E;AAC7E,MAAM,MAAM,eAAe,GAAG,CAC1B,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,KAChB,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IAClC,gBAAgB,CACZ,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,OAAO,EACnB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,SAAS,EAAE,MAAM,EACjB,qBAAqB,CAAC,EAAE,MAAM,EAC9B,aAAa,CAAC,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,OAAO,GAClB,OAAO,CAAC,MAAM,CAAC,CAAC;CACtB;AAMD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAG3F;AAED,oDAAoD;AACpD,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAE3F;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC3C,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,OAAO,GAC3B,0BAA0B,EAAE,CAe9B;AAED,+DAA+D;AAC/D,wBAAgB,+BAA+B,CAC3C,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,OAAO,GAC3B,0BAA0B,EAAE,CAE9B;AAED,wFAAwF;AACxF,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CASjE;AAED,yCAAyC;AACzC,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAEjE;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACpC,YAAY,EAAE,qBAAqB,EACnC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzC,SAAS,EAAE,MAAM,EACjB,aAAa,GAAE,MAAgB,EAC/B,OAAO,CAAC,EAAE,OAAO,GAClB,eAAe,CAcjB;AAED,wDAAwD;AACxD,wBAAgB,wBAAwB,CACpC,YAAY,EAAE,qBAAqB,EACnC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzC,SAAS,EAAE,MAAM,EACjB,aAAa,GAAE,MAAgB,EAC/B,OAAO,CAAC,EAAE,OAAO,GAClB,eAAe,CAEjB;AA+BD;;;;;;;;;;;GAWG;AACH,wBAAsB,wBAAwB,CAC1C,UAAU,EAAE,OAAO,EACnB,OAAO,EAAE,0BAA0B,EAAE,EACrC,WAAW,EAAE,eAAe,EAC5B,kBAAkB,CAAC,EAAE,OAAO,GAC7B,OAAO,CAAC,OAAO,CAAC,CA6BlB;AAED,wDAAwD;AACxD,wBAAsB,wBAAwB,CAC1C,UAAU,EAAE,OAAO,EACnB,OAAO,EAAE,0BAA0B,EAAE,EACrC,WAAW,EAAE,eAAe,EAC5B,kBAAkB,CAAC,EAAE,OAAO,GAC7B,OAAO,CAAC,OAAO,CAAC,CAElB"}
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
* back. Pattern placeholders, path preservation and the unchanged-content skip all come
|
|
18
18
|
* from that existing code.
|
|
19
19
|
*/
|
|
20
|
+
import { HasNestedEnvReference, ParseEnvReference } from './env-reference.js';
|
|
20
21
|
function isPlainObject(value) {
|
|
21
22
|
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
22
23
|
}
|
|
@@ -143,7 +144,8 @@ export async function ExternalizeSubProperties(fieldValue, configs, externalize,
|
|
|
143
144
|
let result = parsed;
|
|
144
145
|
for (const { path, pattern } of configs) {
|
|
145
146
|
const leaf = GetAtPath(result, path);
|
|
146
|
-
|
|
147
|
+
// A leaf that is or holds an `@env:` reference stays inline, so no side file gets a resolved value.
|
|
148
|
+
if (leaf === undefined || leaf === null || ParseEnvReference(leaf) !== null || HasNestedEnvReference(leaf)) {
|
|
147
149
|
continue;
|
|
148
150
|
}
|
|
149
151
|
const existingRef = existing ? GetAtPath(existing, path) : undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-subproperty-externalization.js","sourceRoot":"","sources":["../../src/lib/json-subproperty-externalization.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"json-subproperty-externalization.js","sourceRoot":"","sources":["../../src/lib/json-subproperty-externalization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Splits a `@lookup:` reference the way push reads it, so push, validation and pull agree.
|
|
3
|
+
* Format: `@lookup:Entity.Field1=Value1&Field2=Value2?create&allowDefer&CreateField=Value`.
|
|
4
|
+
* The entity ends at the first `.`; the criteria end at the first `?`; the rest is flags.
|
|
5
|
+
* @module lookup-reference
|
|
6
|
+
*/
|
|
7
|
+
/** A split `@lookup:` reference. */
|
|
8
|
+
export interface LookupSplit {
|
|
9
|
+
EntityName: string;
|
|
10
|
+
/** From after the entity's `.` up to the first `?`. */
|
|
11
|
+
CriteriaText: string;
|
|
12
|
+
/** After the first `?`, or an empty string. */
|
|
13
|
+
FlagsText: string;
|
|
14
|
+
/** Lowercased name of every flags item (the part before `=`). */
|
|
15
|
+
FlagNames: Set<string>;
|
|
16
|
+
/** Lowercased flags items without `=` other than `create` and `allowdefer`. */
|
|
17
|
+
UnknownBareFlags: string[];
|
|
18
|
+
}
|
|
19
|
+
/** One `name=value` item of a lookup. */
|
|
20
|
+
export interface LookupPair {
|
|
21
|
+
Name: string;
|
|
22
|
+
Value: string;
|
|
23
|
+
}
|
|
24
|
+
/** The error text for `?optional` inside a lookup. */
|
|
25
|
+
export declare const LOOKUP_OPTIONAL_MESSAGE = "?optional is not supported in @lookup: (the ? starts lookup flags)";
|
|
26
|
+
/**
|
|
27
|
+
* Splits the text after `@lookup:`.
|
|
28
|
+
* @returns The split, or null when there is no entity name before a `.`
|
|
29
|
+
*/
|
|
30
|
+
export declare function SplitLookupReference(lookupText: string): LookupSplit | null;
|
|
31
|
+
/**
|
|
32
|
+
* Parses `Field1=Value1&Field2=Value2`. Names and values are trimmed; a value may hold `=`.
|
|
33
|
+
* @returns The pairs, or null when an item has no `=`
|
|
34
|
+
*/
|
|
35
|
+
export declare function ParseLookupPairs(criteriaText: string): LookupPair[] | null;
|
|
36
|
+
/** The `key=value` flags items that are not `create` or `allowDefer`, with URI-decoded values. */
|
|
37
|
+
export declare function ParseLookupCreateFields(flagsText: string): LookupPair[];
|
|
38
|
+
//# sourceMappingURL=lookup-reference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lookup-reference.d.ts","sourceRoot":"","sources":["../../src/lib/lookup-reference.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oCAAoC;AACpC,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,+EAA+E;IAC/E,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,yCAAyC;AACzC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,sDAAsD;AACtD,eAAO,MAAM,uBAAuB,uEAAuE,CAAC;AAI5G;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAkB3E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,UAAU,EAAE,GAAG,IAAI,CAU1E;AAED,kGAAkG;AAClG,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE,CAYvE"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Splits a `@lookup:` reference the way push reads it, so push, validation and pull agree.
|
|
3
|
+
* Format: `@lookup:Entity.Field1=Value1&Field2=Value2?create&allowDefer&CreateField=Value`.
|
|
4
|
+
* The entity ends at the first `.`; the criteria end at the first `?`; the rest is flags.
|
|
5
|
+
* @module lookup-reference
|
|
6
|
+
*/
|
|
7
|
+
/** The error text for `?optional` inside a lookup. */
|
|
8
|
+
export const LOOKUP_OPTIONAL_MESSAGE = '?optional is not supported in @lookup: (the ? starts lookup flags)';
|
|
9
|
+
const KNOWN_BARE_FLAGS = new Set(['create', 'allowdefer']);
|
|
10
|
+
/**
|
|
11
|
+
* Splits the text after `@lookup:`.
|
|
12
|
+
* @returns The split, or null when there is no entity name before a `.`
|
|
13
|
+
*/
|
|
14
|
+
export function SplitLookupReference(lookupText) {
|
|
15
|
+
const entityMatch = lookupText.match(/^([^.]+)\./);
|
|
16
|
+
if (!entityMatch) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
const entityName = entityMatch[1];
|
|
20
|
+
const remaining = lookupText.substring(entityName.length + 1);
|
|
21
|
+
const questionMarkIndex = remaining.indexOf('?');
|
|
22
|
+
const criteriaText = questionMarkIndex >= 0 ? remaining.substring(0, questionMarkIndex) : remaining;
|
|
23
|
+
const flagsText = questionMarkIndex >= 0 ? remaining.substring(questionMarkIndex + 1) : '';
|
|
24
|
+
const items = flagsText ? flagsText.split('&') : [];
|
|
25
|
+
const flagNames = new Set(items.map((item) => item.split('=')[0].toLowerCase()));
|
|
26
|
+
const unknownBareFlags = items
|
|
27
|
+
.map((item) => item.trim())
|
|
28
|
+
.filter((item) => item !== '' && !item.includes('='))
|
|
29
|
+
.map((item) => item.toLowerCase())
|
|
30
|
+
.filter((item) => !KNOWN_BARE_FLAGS.has(item));
|
|
31
|
+
return { EntityName: entityName, CriteriaText: criteriaText, FlagsText: flagsText, FlagNames: flagNames, UnknownBareFlags: unknownBareFlags };
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parses `Field1=Value1&Field2=Value2`. Names and values are trimmed; a value may hold `=`.
|
|
35
|
+
* @returns The pairs, or null when an item has no `=`
|
|
36
|
+
*/
|
|
37
|
+
export function ParseLookupPairs(criteriaText) {
|
|
38
|
+
const pairs = [];
|
|
39
|
+
for (const item of criteriaText.split('&')) {
|
|
40
|
+
const match = item.match(/^(.+?)=(.+)$/);
|
|
41
|
+
if (!match) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
pairs.push({ Name: match[1].trim(), Value: match[2].trim() });
|
|
45
|
+
}
|
|
46
|
+
return pairs;
|
|
47
|
+
}
|
|
48
|
+
/** The `key=value` flags items that are not `create` or `allowDefer`, with URI-decoded values. */
|
|
49
|
+
export function ParseLookupCreateFields(flagsText) {
|
|
50
|
+
const fields = [];
|
|
51
|
+
for (const item of flagsText.split('&')) {
|
|
52
|
+
if (KNOWN_BARE_FLAGS.has(item.toLowerCase())) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const [key, value] = item.split('=');
|
|
56
|
+
if (key && value) {
|
|
57
|
+
fields.push({ Name: key, Value: decodeURIComponent(value) });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return fields;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=lookup-reference.js.map
|