directus-deploy-cli 0.17.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -11,8 +11,11 @@ import { diffSubset, formatDiffPath } from "../diff.js";
|
|
|
11
11
|
// "data": [ {"id": 3, "_sync_id": "3", ...}, ... ]
|
|
12
12
|
// }
|
|
13
13
|
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
14
|
+
// Row identity is the collection's real primary key, resolved per collection
|
|
15
|
+
// from /fields/<collection> (schema.is_primary_key) and falling back to `id`
|
|
16
|
+
// when unresolvable (#32 — `notification_types` keys on `key`, not `id`).
|
|
17
|
+
// `_sync_id` is Tractr's own namespace and gets stripped before writes.
|
|
18
|
+
// Additive-only in v0: `delete` is
|
|
16
19
|
// honoured for the read side (server extras aren't flagged as drift) but
|
|
17
20
|
// nothing is DELETEd. If you need to remove a seed row, delete it from git
|
|
18
21
|
// AND from the server manually until we add a `--prune` flag.
|
|
@@ -65,22 +68,50 @@ async function listServer(client, collection) {
|
|
|
65
68
|
const data = raw.data;
|
|
66
69
|
return Array.isArray(data) ? data : [];
|
|
67
70
|
}
|
|
68
|
-
function
|
|
71
|
+
function indexByPk(rows, pk) {
|
|
69
72
|
const map = new Map();
|
|
70
73
|
for (const r of rows) {
|
|
71
|
-
const
|
|
72
|
-
if (
|
|
73
|
-
map.set(String(
|
|
74
|
+
const v = r[pk];
|
|
75
|
+
if (v !== undefined && v !== null)
|
|
76
|
+
map.set(String(v), r);
|
|
74
77
|
}
|
|
75
78
|
return map;
|
|
76
79
|
}
|
|
80
|
+
// PK per collection via /fields/<collection>. Falls back to `id` when the
|
|
81
|
+
// endpoint is unreachable or reports no PK — never throws, so a lookup
|
|
82
|
+
// hiccup degrades to the historical behaviour instead of failing the file.
|
|
83
|
+
async function resolvePrimaryKey(client, collection, cache) {
|
|
84
|
+
const hit = cache.get(collection);
|
|
85
|
+
if (hit !== undefined)
|
|
86
|
+
return hit;
|
|
87
|
+
let pk = "id";
|
|
88
|
+
try {
|
|
89
|
+
const raw = await client.get(`/fields/${collection}`);
|
|
90
|
+
if (Array.isArray(raw)) {
|
|
91
|
+
const pkField = raw.find((f) => {
|
|
92
|
+
// Some schema inspectors report 1 / "YES" instead of boolean true.
|
|
93
|
+
const v = f.schema?.is_primary_key;
|
|
94
|
+
return v === true || v === 1 || v === "YES";
|
|
95
|
+
});
|
|
96
|
+
if (pkField && typeof pkField.field === "string")
|
|
97
|
+
pk = pkField.field;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// fall back to `id`
|
|
102
|
+
}
|
|
103
|
+
cache.set(collection, pk);
|
|
104
|
+
return pk;
|
|
105
|
+
}
|
|
77
106
|
export async function reconcileSeeds(input) {
|
|
78
107
|
const results = [];
|
|
79
108
|
const files = await readSeedFiles(input.seedDir);
|
|
80
109
|
if (files.length === 0)
|
|
81
110
|
return results;
|
|
111
|
+
const pkCache = new Map();
|
|
82
112
|
for (const file of files) {
|
|
83
113
|
const { collection } = file;
|
|
114
|
+
const pk = await resolvePrimaryKey(input.client, collection, pkCache);
|
|
84
115
|
const create = file.meta?.create !== false;
|
|
85
116
|
const update = file.meta?.update !== false;
|
|
86
117
|
let server;
|
|
@@ -96,14 +127,23 @@ export async function reconcileSeeds(input) {
|
|
|
96
127
|
});
|
|
97
128
|
continue;
|
|
98
129
|
}
|
|
99
|
-
const
|
|
100
|
-
for (const rawRow of file.data ?? []) {
|
|
101
|
-
const id = rawRow
|
|
102
|
-
if (id === undefined || id === null)
|
|
130
|
+
const byPk = indexByPk(server, pk);
|
|
131
|
+
for (const [i, rawRow] of (file.data ?? []).entries()) {
|
|
132
|
+
const id = rawRow[pk];
|
|
133
|
+
if (id === undefined || id === null) {
|
|
134
|
+
// #32: never skip silently — an invisible row is indistinguishable
|
|
135
|
+
// from "nothing to do" in plan/apply output.
|
|
136
|
+
results.push({
|
|
137
|
+
kind: "seeds",
|
|
138
|
+
label: `seeds/${collection}[row ${i}]`,
|
|
139
|
+
action: "skipped",
|
|
140
|
+
reason: `row has no value for primary key '${pk}'`,
|
|
141
|
+
});
|
|
103
142
|
continue;
|
|
143
|
+
}
|
|
104
144
|
const label = `seeds/${collection}[${String(id)}]`;
|
|
105
145
|
const payload = sanitizeSeedRow(rawRow);
|
|
106
|
-
const existing =
|
|
146
|
+
const existing = byPk.get(String(id));
|
|
107
147
|
if (existing === undefined) {
|
|
108
148
|
if (!create) {
|
|
109
149
|
results.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seeds.js","sourceRoot":"","sources":["../../src/reconcilers/seeds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAExD,8EAA8E;AAC9E,iDAAiD;AACjD,EAAE;AACF,MAAM;AACN,2CAA2C;AAC3C,0DAA0D;AAC1D,kEAAkE;AAClE,uDAAuD;AACvD,MAAM;AACN,EAAE;AACF,6EAA6E;AAC7E,
|
|
1
|
+
{"version":3,"file":"seeds.js","sourceRoot":"","sources":["../../src/reconcilers/seeds.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "directus-deploy-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.0",
|
|
4
4
|
"description": "Per-entity, non-atomic Directus deployment tool. Reconciles collections/fields/relations/roles/policies/permissions/flows/operations/migrations/seeds from git to any environment.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|