everything-dev 1.12.4 → 1.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli.js +1 -1
- package/dist/app.cjs +17 -5
- package/dist/app.cjs.map +1 -1
- package/dist/app.mjs +17 -5
- package/dist/app.mjs.map +1 -1
- package/dist/cli/init.cjs +143 -66
- package/dist/cli/init.cjs.map +1 -1
- package/dist/cli/init.d.cts +1 -1
- package/dist/cli/init.d.cts.map +1 -1
- package/dist/cli/init.d.mts +1 -1
- package/dist/cli/init.d.mts.map +1 -1
- package/dist/cli/init.mjs +144 -67
- package/dist/cli/init.mjs.map +1 -1
- package/dist/cli/prompts.cjs +3 -3
- package/dist/cli/prompts.cjs.map +1 -1
- package/dist/cli/prompts.mjs +3 -3
- package/dist/cli/prompts.mjs.map +1 -1
- package/dist/cli/sync.cjs +15 -56
- package/dist/cli/sync.cjs.map +1 -1
- package/dist/cli/sync.mjs +15 -56
- package/dist/cli/sync.mjs.map +1 -1
- package/dist/cli/upgrade.cjs +3 -1
- package/dist/cli/upgrade.cjs.map +1 -1
- package/dist/cli/upgrade.mjs +3 -1
- package/dist/cli/upgrade.mjs.map +1 -1
- package/dist/config.cjs +206 -69
- package/dist/config.cjs.map +1 -1
- package/dist/config.d.cts +13 -6
- package/dist/config.d.cts.map +1 -1
- package/dist/config.d.mts +13 -6
- package/dist/config.d.mts.map +1 -1
- package/dist/config.mjs +201 -71
- package/dist/config.mjs.map +1 -1
- package/dist/contract.d.cts +104 -8
- package/dist/contract.d.cts.map +1 -1
- package/dist/contract.d.mts +104 -8
- package/dist/contract.d.mts.map +1 -1
- package/dist/host.cjs +34 -1
- package/dist/host.cjs.map +1 -1
- package/dist/host.d.cts.map +1 -1
- package/dist/host.d.mts.map +1 -1
- package/dist/host.mjs +34 -1
- package/dist/host.mjs.map +1 -1
- package/dist/index.cjs +16 -0
- package/dist/index.d.cts +5 -3
- package/dist/index.d.mts +5 -3
- package/dist/index.mjs +5 -3
- package/dist/merge.cjs +113 -0
- package/dist/merge.cjs.map +1 -0
- package/dist/merge.d.cts +7 -0
- package/dist/merge.d.cts.map +1 -0
- package/dist/merge.d.mts +7 -0
- package/dist/merge.d.mts.map +1 -0
- package/dist/merge.mjs +107 -0
- package/dist/merge.mjs.map +1 -0
- package/dist/plugin.cjs +117 -105
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.cts +114 -8
- package/dist/plugin.d.cts.map +1 -1
- package/dist/plugin.d.mts +114 -8
- package/dist/plugin.d.mts.map +1 -1
- package/dist/plugin.mjs +117 -105
- package/dist/plugin.mjs.map +1 -1
- package/dist/service-descriptor.cjs +21 -0
- package/dist/service-descriptor.cjs.map +1 -1
- package/dist/service-descriptor.d.cts +23 -1
- package/dist/service-descriptor.d.cts.map +1 -1
- package/dist/service-descriptor.d.mts +23 -1
- package/dist/service-descriptor.d.mts.map +1 -1
- package/dist/service-descriptor.mjs +21 -0
- package/dist/service-descriptor.mjs.map +1 -1
- package/dist/shared.cjs +24 -2
- package/dist/shared.cjs.map +1 -1
- package/dist/shared.d.cts +3 -0
- package/dist/shared.d.cts.map +1 -1
- package/dist/shared.d.mts +3 -0
- package/dist/shared.d.mts.map +1 -1
- package/dist/shared.mjs +25 -3
- package/dist/shared.mjs.map +1 -1
- package/dist/sidebar.cjs +124 -0
- package/dist/sidebar.cjs.map +1 -0
- package/dist/sidebar.d.cts +8 -0
- package/dist/sidebar.d.cts.map +1 -0
- package/dist/sidebar.d.mts +8 -0
- package/dist/sidebar.d.mts.map +1 -0
- package/dist/sidebar.mjs +122 -0
- package/dist/sidebar.mjs.map +1 -0
- package/dist/types.cjs +104 -10
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +256 -29
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +256 -29
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs +100 -11
- package/dist/types.mjs.map +1 -1
- package/dist/utils/path-match.cjs +18 -0
- package/dist/utils/path-match.cjs.map +1 -0
- package/dist/utils/path-match.mjs +17 -0
- package/dist/utils/path-match.mjs.map +1 -0
- package/dist/utils/save-config.cjs +19 -0
- package/dist/utils/save-config.cjs.map +1 -0
- package/dist/utils/save-config.mjs +18 -0
- package/dist/utils/save-config.mjs.map +1 -0
- package/package.json +3 -2
- package/skills/dev-workflow/SKILL.md +8 -0
- package/skills/extends-config/SKILL.md +132 -0
- package/skills/init-upgrade/SKILL.md +128 -0
- package/skills/publish-sync/SKILL.md +30 -0
- package/src/app.ts +15 -5
- package/src/cli/init.ts +199 -100
- package/src/cli/prompts.ts +2 -2
- package/src/cli/sync.ts +27 -96
- package/src/cli/upgrade.ts +2 -0
- package/src/config.ts +306 -119
- package/src/host.ts +45 -0
- package/src/index.ts +1 -0
- package/src/merge.ts +198 -0
- package/src/plugin.ts +340 -318
- package/src/service-descriptor.ts +23 -0
- package/src/shared.ts +48 -5
- package/src/sidebar.ts +162 -0
- package/src/types.ts +134 -28
- package/src/utils/path-match.ts +16 -0
- package/src/utils/save-config.ts +20 -0
package/src/index.ts
CHANGED
package/src/merge.ts
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { createDefu } from "defu";
|
|
2
|
+
import type { BosConfigInput, ExtendsConfig } from "./types";
|
|
3
|
+
|
|
4
|
+
export const BOS_CONFIG_ORDER = [
|
|
5
|
+
"extends",
|
|
6
|
+
"account",
|
|
7
|
+
"domain",
|
|
8
|
+
"testnet",
|
|
9
|
+
"staging",
|
|
10
|
+
"repository",
|
|
11
|
+
"app",
|
|
12
|
+
"plugins",
|
|
13
|
+
"shared",
|
|
14
|
+
] as const;
|
|
15
|
+
|
|
16
|
+
export type BosConfigFieldName = (typeof BOS_CONFIG_ORDER)[number];
|
|
17
|
+
|
|
18
|
+
export type BosEnv = "development" | "production" | "staging";
|
|
19
|
+
|
|
20
|
+
export interface ResolvedConfigMeta {
|
|
21
|
+
env: BosEnv;
|
|
22
|
+
resolvedAt: string;
|
|
23
|
+
extendsChain: string[];
|
|
24
|
+
source?: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const ARRAY_UNION_KEYS = new Set(["secrets"]);
|
|
28
|
+
|
|
29
|
+
export function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
30
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function unionArrays(a: unknown, b: unknown): unknown[] | undefined {
|
|
34
|
+
const aArr = Array.isArray(a) ? a : [];
|
|
35
|
+
const bArr = Array.isArray(b) ? b : [];
|
|
36
|
+
if (aArr.length === 0 && bArr.length === 0) return undefined;
|
|
37
|
+
const seen = new Set<string>();
|
|
38
|
+
const result: unknown[] = [];
|
|
39
|
+
for (const item of [...aArr, ...bArr]) {
|
|
40
|
+
if (typeof item === "string") {
|
|
41
|
+
if (seen.has(item)) continue;
|
|
42
|
+
seen.add(item);
|
|
43
|
+
}
|
|
44
|
+
result.push(item);
|
|
45
|
+
}
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function cleanNullSentinels(obj: Record<string, unknown>): Record<string, unknown> {
|
|
50
|
+
const out: Record<string, unknown> = {};
|
|
51
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
52
|
+
if (value === null || value === undefined) continue;
|
|
53
|
+
if (isPlainObject(value)) {
|
|
54
|
+
const cleaned = cleanNullSentinels(value);
|
|
55
|
+
if (Object.keys(cleaned).length > 0) {
|
|
56
|
+
out[key] = cleaned;
|
|
57
|
+
}
|
|
58
|
+
} else {
|
|
59
|
+
out[key] = value;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
66
|
+
const bosConfigMerger = createDefu((obj: any, key: any, value: any): boolean | undefined => {
|
|
67
|
+
if (obj[key] === null) return true;
|
|
68
|
+
if (value === null) {
|
|
69
|
+
obj[key] = null;
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
if (Array.isArray(obj[key]) && Array.isArray(value)) {
|
|
73
|
+
if (ARRAY_UNION_KEYS.has(key)) {
|
|
74
|
+
obj[key] = unionArrays(obj[key], value);
|
|
75
|
+
} else {
|
|
76
|
+
obj[key] = value;
|
|
77
|
+
}
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
export function resolveExtendsRef(
|
|
84
|
+
extendsField: string | ExtendsConfig | undefined,
|
|
85
|
+
env: BosEnv,
|
|
86
|
+
): string | undefined {
|
|
87
|
+
if (!extendsField) return undefined;
|
|
88
|
+
if (typeof extendsField === "string") return extendsField;
|
|
89
|
+
return extendsField[env] ?? extendsField.production ?? Object.values(extendsField).find(Boolean);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export function mergeBosConfigWithExtends(
|
|
93
|
+
parent: BosConfigInput,
|
|
94
|
+
child: BosConfigInput,
|
|
95
|
+
): BosConfigInput {
|
|
96
|
+
const merged = bosConfigMerger(child, parent) as BosConfigInput;
|
|
97
|
+
|
|
98
|
+
if (isPlainObject(parent.plugins) && isPlainObject(child.plugins)) {
|
|
99
|
+
const plugins: Record<string, unknown> = { ...parent.plugins };
|
|
100
|
+
for (const [key, rawValue] of Object.entries(child.plugins)) {
|
|
101
|
+
const value = rawValue as unknown;
|
|
102
|
+
if (value === null || value === false) {
|
|
103
|
+
delete plugins[key];
|
|
104
|
+
} else if (isPlainObject(plugins[key]) && isPlainObject(value)) {
|
|
105
|
+
plugins[key] = bosConfigMerger(
|
|
106
|
+
value as Record<string, unknown>,
|
|
107
|
+
plugins[key] as Record<string, unknown>,
|
|
108
|
+
);
|
|
109
|
+
} else {
|
|
110
|
+
plugins[key] = value;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
(merged as Record<string, unknown>).plugins = plugins;
|
|
114
|
+
} else if (child.plugins !== undefined) {
|
|
115
|
+
(merged as Record<string, unknown>).plugins = cleanNullSentinels(
|
|
116
|
+
child.plugins as Record<string, unknown>,
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const mergedRecord = merged as Record<string, unknown>;
|
|
121
|
+
|
|
122
|
+
if (isPlainObject(mergedRecord.app)) {
|
|
123
|
+
for (const entryVal of Object.values(mergedRecord.app as Record<string, unknown>)) {
|
|
124
|
+
if (!isPlainObject(entryVal)) continue;
|
|
125
|
+
for (const secretKey of ARRAY_UNION_KEYS) {
|
|
126
|
+
if (Array.isArray(entryVal[secretKey])) {
|
|
127
|
+
entryVal[secretKey] =
|
|
128
|
+
(unionArrays(entryVal[secretKey] as unknown[], []) as string[] | undefined)?.filter(
|
|
129
|
+
Boolean,
|
|
130
|
+
) ?? entryVal[secretKey];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (isPlainObject(mergedRecord.plugins)) {
|
|
137
|
+
for (const pluginVal of Object.values(mergedRecord.plugins as Record<string, unknown>)) {
|
|
138
|
+
if (!isPlainObject(pluginVal)) continue;
|
|
139
|
+
for (const secretKey of ARRAY_UNION_KEYS) {
|
|
140
|
+
if (Array.isArray(pluginVal[secretKey])) {
|
|
141
|
+
pluginVal[secretKey] =
|
|
142
|
+
(unionArrays(pluginVal[secretKey] as unknown[], []) as string[] | undefined)?.filter(
|
|
143
|
+
Boolean,
|
|
144
|
+
) ?? pluginVal[secretKey];
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return rebuildOrderedConfig(mergedRecord) as BosConfigInput;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export function mergeBosConfigWithTemplate(
|
|
154
|
+
local: BosConfigInput,
|
|
155
|
+
template: BosConfigInput,
|
|
156
|
+
): BosConfigInput {
|
|
157
|
+
const merged = mergeJsonValuesPreservingLocalOrder(local, template) as BosConfigInput;
|
|
158
|
+
return rebuildOrderedConfig(merged as Record<string, unknown>) as BosConfigInput;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function mergeJsonValuesPreservingLocalOrder(local: unknown, template: unknown): unknown {
|
|
162
|
+
if (isPlainObject(local) && isPlainObject(template)) {
|
|
163
|
+
const merged: Record<string, unknown> = {};
|
|
164
|
+
for (const key of Object.keys(local)) {
|
|
165
|
+
merged[key] = mergeJsonValuesPreservingLocalOrder(
|
|
166
|
+
local[key],
|
|
167
|
+
(template as Record<string, unknown>)[key],
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
for (const key of Object.keys(template as Record<string, unknown>)) {
|
|
171
|
+
if (!(key in merged)) {
|
|
172
|
+
merged[key] = (template as Record<string, unknown>)[key];
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return merged;
|
|
176
|
+
}
|
|
177
|
+
return local ?? template;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export function rebuildOrderedConfig<T extends Record<string, unknown>>(config: T): T {
|
|
181
|
+
const ordered: Record<string, unknown> = {};
|
|
182
|
+
|
|
183
|
+
for (const key of BOS_CONFIG_ORDER) {
|
|
184
|
+
if (key in config) {
|
|
185
|
+
ordered[key] = config[key];
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
for (const key of Object.keys(config)) {
|
|
190
|
+
if (!BOS_CONFIG_ORDER.includes(key as BosConfigFieldName)) {
|
|
191
|
+
ordered[key] = config[key];
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
return ordered as T;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export { bosConfigMerger };
|