@dsh-workbench/shared 1.1.1 → 1.1.3
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/dist/contract/protocol/market-index.d.ts +35 -1
- package/dist/contract/protocol/market-index.js +1 -0
- package/dist/host/changelog.d.ts +7 -0
- package/dist/host/changelog.js +12 -0
- package/dist/host/market-index-claim.d.ts +18 -0
- package/dist/host/market-index-claim.js +83 -0
- package/dist/host/market-index.js +34 -2
- package/dist/host.d.ts +2 -0
- package/dist/host.js +2 -0
- package/dist/i18n/en.js +45 -5
- package/dist/i18n/index.d.ts +46 -6
- package/dist/i18n/zh.d.ts +45 -5
- package/dist/i18n/zh.js +45 -5
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/lib/git-address.d.ts +23 -0
- package/dist/lib/git-address.js +79 -0
- package/package.json +1 -1
- package/src/contract/protocol/market-index.ts +27 -2
- package/src/host/__tests__/changelog.test.ts +33 -0
- package/src/host/__tests__/market-index.test.ts +166 -0
- package/src/host/changelog.ts +19 -0
- package/src/host/market-index-claim.ts +91 -0
- package/src/host/market-index.ts +33 -2
- package/src/host.ts +2 -0
- package/src/i18n/en.ts +45 -5
- package/src/i18n/zh.ts +45 -5
- package/src/index.ts +1 -0
- package/src/lib/git-address.test.ts +63 -0
- package/src/lib/git-address.ts +92 -0
|
@@ -2,11 +2,17 @@ export declare const MARKET_INDEX_FORMAT = 1;
|
|
|
2
2
|
export declare const MARKET_INDEX_PATH = "market.json";
|
|
3
3
|
export declare const MARKET_DISCOVER_ROUTE = "panels/market-discover";
|
|
4
4
|
export declare const MARKET_DOC_ROUTE = "panels/market-doc";
|
|
5
|
+
export declare const MARKET_GIT_PROBE_ROUTE = "panels/git-probe";
|
|
5
6
|
export declare const MARKET_PUBLISH_PREVIEW_ROUTE = "panels/market-publish-preview";
|
|
6
7
|
export declare const MARKET_SOURCES_RESOURCE = "market-sources";
|
|
7
8
|
export declare const MARKET_SOURCES_ROUTE = "panels/market-sources";
|
|
8
9
|
export declare const MARKET_WORKBENCH_LABEL = "workbench";
|
|
9
10
|
export type MarketSourceKind = 'http' | 'git';
|
|
11
|
+
export type GitProbeStatus = 'ok' | 'auth' | 'unreachable';
|
|
12
|
+
export interface GitProbePayload {
|
|
13
|
+
readonly status: GitProbeStatus;
|
|
14
|
+
readonly detail?: string;
|
|
15
|
+
}
|
|
10
16
|
export type MarketSourcePolicy = 'artifacts-in-repo' | 'catalog-only';
|
|
11
17
|
export interface IndexSourceSpec {
|
|
12
18
|
readonly kind: MarketSourceKind;
|
|
@@ -45,6 +51,8 @@ export interface MarketIndexVersion {
|
|
|
45
51
|
readonly engines?: MarketIndexEngines;
|
|
46
52
|
}
|
|
47
53
|
export interface MarketIndexEntryMetadata {
|
|
54
|
+
readonly workbench?: boolean;
|
|
55
|
+
readonly unit?: string;
|
|
48
56
|
readonly category?: string;
|
|
49
57
|
readonly labels?: readonly string[];
|
|
50
58
|
readonly keywords?: readonly string[];
|
|
@@ -55,11 +63,31 @@ export interface MarketIndexEntry {
|
|
|
55
63
|
readonly title?: MarketLocalizedText;
|
|
56
64
|
readonly description?: MarketLocalizedText;
|
|
57
65
|
readonly author?: string;
|
|
66
|
+
readonly owner?: string;
|
|
58
67
|
readonly homepage?: string;
|
|
59
68
|
readonly icon?: string;
|
|
60
69
|
readonly metadata?: MarketIndexEntryMetadata;
|
|
61
70
|
readonly versions: readonly MarketIndexVersion[];
|
|
62
71
|
}
|
|
72
|
+
export type MarketClaim = {
|
|
73
|
+
readonly state: 'new';
|
|
74
|
+
} | {
|
|
75
|
+
readonly state: 'owned';
|
|
76
|
+
readonly owner: string;
|
|
77
|
+
} | {
|
|
78
|
+
readonly state: 'unowned';
|
|
79
|
+
} | {
|
|
80
|
+
readonly state: 'conflict';
|
|
81
|
+
readonly owner: string;
|
|
82
|
+
} | {
|
|
83
|
+
readonly state: 'unit-taken';
|
|
84
|
+
readonly entry: string;
|
|
85
|
+
} | {
|
|
86
|
+
readonly state: 'path-taken';
|
|
87
|
+
readonly entry: string;
|
|
88
|
+
} | {
|
|
89
|
+
readonly state: 'unknown';
|
|
90
|
+
};
|
|
63
91
|
export interface MarketIndexCategory {
|
|
64
92
|
readonly title?: MarketLocalizedText;
|
|
65
93
|
}
|
|
@@ -82,7 +110,7 @@ export interface MarketIndex {
|
|
|
82
110
|
readonly metadata?: MarketIndexMetadata;
|
|
83
111
|
readonly plugins: readonly MarketIndexEntry[];
|
|
84
112
|
}
|
|
85
|
-
export type MarketIndexProblemKind = 'not-json' | 'not-object' | 'format' | 'plugins' | 'plugin' | 'name' | 'duplicate-name' | 'versions' | 'version' | 'version-order' | 'source' | 'git-commit' | 'timestamp' | 'icon';
|
|
113
|
+
export type MarketIndexProblemKind = 'not-json' | 'not-object' | 'format' | 'plugins' | 'plugin' | 'name' | 'duplicate-name' | 'versions' | 'version' | 'version-order' | 'source' | 'git-commit' | 'timestamp' | 'icon' | 'owner' | 'unit';
|
|
86
114
|
export interface MarketIndexProblem {
|
|
87
115
|
readonly kind: MarketIndexProblemKind;
|
|
88
116
|
readonly detail: string;
|
|
@@ -158,6 +186,7 @@ export interface PublishChangelog {
|
|
|
158
186
|
readonly version: string;
|
|
159
187
|
readonly text?: string;
|
|
160
188
|
readonly missing?: boolean;
|
|
189
|
+
readonly pending?: boolean;
|
|
161
190
|
}
|
|
162
191
|
export interface PublishPreview {
|
|
163
192
|
readonly name: string;
|
|
@@ -165,6 +194,7 @@ export interface PublishPreview {
|
|
|
165
194
|
readonly author?: string;
|
|
166
195
|
readonly registry?: string;
|
|
167
196
|
readonly market?: MarketPublishDestination;
|
|
197
|
+
readonly claim?: MarketClaim;
|
|
168
198
|
readonly changelog?: PublishChangelog;
|
|
169
199
|
}
|
|
170
200
|
export type DiscoverDocKind = 'readme' | 'changelog';
|
|
@@ -194,4 +224,8 @@ export type MarketSourcesAction = {
|
|
|
194
224
|
readonly action: 'init';
|
|
195
225
|
readonly id: string;
|
|
196
226
|
readonly ref?: string;
|
|
227
|
+
readonly stampOnly?: boolean;
|
|
228
|
+
} | {
|
|
229
|
+
readonly action: 'read-only';
|
|
230
|
+
readonly id: string;
|
|
197
231
|
};
|
|
@@ -2,6 +2,7 @@ export const MARKET_INDEX_FORMAT = 1;
|
|
|
2
2
|
export const MARKET_INDEX_PATH = 'market.json';
|
|
3
3
|
export const MARKET_DISCOVER_ROUTE = 'panels/market-discover';
|
|
4
4
|
export const MARKET_DOC_ROUTE = 'panels/market-doc';
|
|
5
|
+
export const MARKET_GIT_PROBE_ROUTE = 'panels/git-probe';
|
|
5
6
|
export const MARKET_PUBLISH_PREVIEW_ROUTE = 'panels/market-publish-preview';
|
|
6
7
|
export const MARKET_SOURCES_RESOURCE = 'market-sources';
|
|
7
8
|
export const MARKET_SOURCES_ROUTE = 'panels/market-sources';
|
package/dist/host/changelog.d.ts
CHANGED
|
@@ -19,3 +19,10 @@ export declare function parseChangelog(text: string): readonly ChangelogSection[
|
|
|
19
19
|
export declare function changelogSectionOf(text: string, version: string): string | undefined;
|
|
20
20
|
export declare function changelogHasEntry(text: string, version: string): boolean;
|
|
21
21
|
export declare function appendChangelogEntry(text: string, options: ChangelogEntryOptions): string;
|
|
22
|
+
export interface ChangelogPlan {
|
|
23
|
+
readonly action: 'kept' | 'written';
|
|
24
|
+
readonly version: string;
|
|
25
|
+
readonly text: string;
|
|
26
|
+
readonly section: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function planChangelog(text: string, options: ChangelogEntryOptions): ChangelogPlan | undefined;
|
package/dist/host/changelog.js
CHANGED
|
@@ -177,6 +177,18 @@ export function appendChangelogEntry(text, options) {
|
|
|
177
177
|
out.splice(at, 0, ...bullets);
|
|
178
178
|
return `${normalizeWhitespace(out)}\n`;
|
|
179
179
|
}
|
|
180
|
+
export function planChangelog(text, options) {
|
|
181
|
+
const source = normalizeChangelogText(text);
|
|
182
|
+
const version = changelogVersion(options.version);
|
|
183
|
+
const section = changelogSectionOf(source, version);
|
|
184
|
+
if (section !== undefined && changelogHasEntry(source, version)) {
|
|
185
|
+
return { action: 'kept', version, text: source, section };
|
|
186
|
+
}
|
|
187
|
+
if (bulletsOf(options.note).length === 0)
|
|
188
|
+
return undefined;
|
|
189
|
+
const next = appendChangelogEntry(source, options);
|
|
190
|
+
return { action: 'written', version, text: next, section: changelogSectionOf(next, version) ?? '' };
|
|
191
|
+
}
|
|
180
192
|
function normalizeWhitespace(rows) {
|
|
181
193
|
const out = [];
|
|
182
194
|
for (const row of rows) {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { MarketClaim, MarketIndex, MarketIndexEntry } from '../contract/protocol/market-index.js';
|
|
2
|
+
export interface PublisherIdentity {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly email?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function publisherIdentityOf(text: string | undefined): PublisherIdentity | undefined;
|
|
7
|
+
export declare function samePublisher(left: string, right: string): boolean;
|
|
8
|
+
export declare function entryOwnerOf(entry: MarketIndexEntry): string | undefined;
|
|
9
|
+
export declare function claimOfEntry(entry: MarketIndexEntry | undefined, publisher: string | undefined): MarketClaim;
|
|
10
|
+
export interface MarketClaimInput {
|
|
11
|
+
readonly name: string;
|
|
12
|
+
readonly publisher: string | undefined;
|
|
13
|
+
readonly unit?: string | undefined;
|
|
14
|
+
readonly artifactPath?: string | undefined;
|
|
15
|
+
}
|
|
16
|
+
export declare function marketArtifactPath(name: string): string;
|
|
17
|
+
export declare function entryUnitOf(entry: MarketIndexEntry): string | undefined;
|
|
18
|
+
export declare function claimOf(index: MarketIndex, input: MarketClaimInput): MarketClaim;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
function foldedName(name) {
|
|
2
|
+
return name.replace(/\s+/gu, ' ').trim().toLowerCase();
|
|
3
|
+
}
|
|
4
|
+
export function publisherIdentityOf(text) {
|
|
5
|
+
const raw = (text ?? '').trim();
|
|
6
|
+
if (raw === '')
|
|
7
|
+
return undefined;
|
|
8
|
+
const match = /^(.*?)\s*<([^<>]*)>\s*$/u.exec(raw);
|
|
9
|
+
const name = (match === null ? raw : match[1]).trim();
|
|
10
|
+
const email = match === null ? '' : match[2].trim().toLowerCase();
|
|
11
|
+
if (name === '')
|
|
12
|
+
return undefined;
|
|
13
|
+
return email === '' ? { name } : { name, email };
|
|
14
|
+
}
|
|
15
|
+
export function samePublisher(left, right) {
|
|
16
|
+
const a = publisherIdentityOf(left);
|
|
17
|
+
const b = publisherIdentityOf(right);
|
|
18
|
+
if (a === undefined || b === undefined)
|
|
19
|
+
return false;
|
|
20
|
+
if (a.email !== undefined && b.email !== undefined)
|
|
21
|
+
return a.email === b.email;
|
|
22
|
+
return foldedName(a.name) === foldedName(b.name);
|
|
23
|
+
}
|
|
24
|
+
export function entryOwnerOf(entry) {
|
|
25
|
+
const owner = (entry.owner ?? '').trim();
|
|
26
|
+
if (owner !== '')
|
|
27
|
+
return owner;
|
|
28
|
+
const author = (entry.author ?? '').trim();
|
|
29
|
+
return author === '' ? undefined : author;
|
|
30
|
+
}
|
|
31
|
+
export function claimOfEntry(entry, publisher) {
|
|
32
|
+
if (entry === undefined)
|
|
33
|
+
return { state: 'new' };
|
|
34
|
+
const owner = entryOwnerOf(entry);
|
|
35
|
+
if (owner === undefined)
|
|
36
|
+
return { state: 'unowned' };
|
|
37
|
+
if (publisher === undefined || publisher.trim() === '')
|
|
38
|
+
return { state: 'unknown' };
|
|
39
|
+
return samePublisher(owner, publisher) ? { state: 'owned', owner } : { state: 'conflict', owner };
|
|
40
|
+
}
|
|
41
|
+
export function marketArtifactPath(name) {
|
|
42
|
+
return `packages/${name}`;
|
|
43
|
+
}
|
|
44
|
+
export function entryUnitOf(entry) {
|
|
45
|
+
const unit = entry.metadata?.unit?.trim();
|
|
46
|
+
if (unit !== undefined && unit !== '')
|
|
47
|
+
return unit;
|
|
48
|
+
for (const version of entry.versions) {
|
|
49
|
+
if (version.source.type !== 'git')
|
|
50
|
+
continue;
|
|
51
|
+
const match = /^packages\/([^/]+)$/u.exec(version.source.path ?? '');
|
|
52
|
+
const legacy = match?.[1];
|
|
53
|
+
if (legacy !== undefined)
|
|
54
|
+
return legacy;
|
|
55
|
+
}
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
export function claimOf(index, input) {
|
|
59
|
+
const base = claimOfEntry(index.plugins.find((one) => one.name === input.name), input.publisher);
|
|
60
|
+
if (base.state === 'conflict' || base.state === 'unknown')
|
|
61
|
+
return base;
|
|
62
|
+
const unit = (input.unit ?? '').trim();
|
|
63
|
+
if (unit !== '') {
|
|
64
|
+
for (const other of index.plugins) {
|
|
65
|
+
if (other.name === input.name)
|
|
66
|
+
continue;
|
|
67
|
+
if (entryUnitOf(other) !== unit)
|
|
68
|
+
continue;
|
|
69
|
+
return { state: 'unit-taken', entry: other.name };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const path = (input.artifactPath ?? '').trim();
|
|
73
|
+
if (path !== '') {
|
|
74
|
+
for (const other of index.plugins) {
|
|
75
|
+
if (other.name === input.name)
|
|
76
|
+
continue;
|
|
77
|
+
if (!other.versions.some((one) => one.source.type === 'git' && (one.source.path ?? '') === path))
|
|
78
|
+
continue;
|
|
79
|
+
return { state: 'path-taken', entry: other.name };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return base;
|
|
83
|
+
}
|
|
@@ -17,7 +17,10 @@ export const MARKET_INDEX_README_LINES = [
|
|
|
17
17
|
'dsh-wb-module release --index <本仓库地址> --index-policy artifacts-in-repo',
|
|
18
18
|
'```',
|
|
19
19
|
'',
|
|
20
|
-
'产物会提交到 `packages
|
|
20
|
+
'产物会提交到 `packages/<包名>/`(带 scope 时是 `packages/@scope/名字/`),并更新 `market.json`。',
|
|
21
|
+
'',
|
|
22
|
+
'一个包名归第一次发布的人(`market.json` 里的 `owner`)。换一个署名发同名会被拒;要换人,先把这一条的 `owner` 改成新的人。',
|
|
23
|
+
'同一个市场里,一个模块 id(`metadata.unit`)只能被一个条目使用;另一个包名想用同一个 id / 产物目录也会被拒。',
|
|
21
24
|
'',
|
|
22
25
|
'## 使用这个索引',
|
|
23
26
|
'',
|
|
@@ -137,10 +140,21 @@ function iconProblem(icon) {
|
|
|
137
140
|
return undefined;
|
|
138
141
|
return problem('icon', 'icon 只能是 base64 data URL 或 http(s) URL');
|
|
139
142
|
}
|
|
143
|
+
const MAX_OWNER_CHARS = 200;
|
|
144
|
+
const UNIT_ID = /^[a-z][a-z0-9-]*$/;
|
|
145
|
+
function ownerProblem(owner) {
|
|
146
|
+
if (/[\r\n]/u.test(owner))
|
|
147
|
+
return problem('owner', 'owner 只能是一行署名');
|
|
148
|
+
if (owner.length > MAX_OWNER_CHARS)
|
|
149
|
+
return problem('owner', 'owner 超过 200 字');
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
140
152
|
function metadataOf(raw) {
|
|
141
153
|
const record = asRecord(raw);
|
|
142
154
|
if (record === undefined)
|
|
143
155
|
return undefined;
|
|
156
|
+
const workbench = record['workbench'] === true;
|
|
157
|
+
const unit = asText(record['unit']);
|
|
144
158
|
const category = asText(record['category']);
|
|
145
159
|
const labels = asTextArray(record['labels']);
|
|
146
160
|
const keywords = asTextArray(record['keywords']);
|
|
@@ -149,6 +163,8 @@ function metadataOf(raw) {
|
|
|
149
163
|
? undefined
|
|
150
164
|
: Object.fromEntries(Object.entries(sortKeysRecord).flatMap(([key, value]) => typeof value === 'string' || typeof value === 'number' ? [[key, value]] : []));
|
|
151
165
|
return {
|
|
166
|
+
...(workbench ? { workbench: true } : {}),
|
|
167
|
+
...(unit === '' ? {} : { unit }),
|
|
152
168
|
...(category === '' ? {} : { category }),
|
|
153
169
|
...(labels.length === 0 ? {} : { labels }),
|
|
154
170
|
...(keywords.length === 0 ? {} : { keywords }),
|
|
@@ -175,14 +191,24 @@ function entryOf(raw, at) {
|
|
|
175
191
|
const title = asLocalized(record['title']);
|
|
176
192
|
const description = asLocalized(record['description']);
|
|
177
193
|
const author = asText(record['author']);
|
|
194
|
+
const owner = asText(record['owner']);
|
|
195
|
+
if (owner !== '') {
|
|
196
|
+
const badOwner = ownerProblem(owner);
|
|
197
|
+
if (badOwner !== undefined)
|
|
198
|
+
return badOwner;
|
|
199
|
+
}
|
|
178
200
|
const homepage = asText(record['homepage']);
|
|
179
201
|
const metadata = metadataOf(record['metadata']);
|
|
202
|
+
if (metadata?.unit !== undefined && !UNIT_ID.test(metadata.unit)) {
|
|
203
|
+
return problem('unit', `metadata.unit 只能是小写字母开头的 a-z0-9-(现在是 ${JSON.stringify(metadata.unit)})`, at);
|
|
204
|
+
}
|
|
180
205
|
return {
|
|
181
206
|
name,
|
|
182
207
|
versions,
|
|
183
208
|
...(title === undefined ? {} : { title }),
|
|
184
209
|
...(description === undefined ? {} : { description }),
|
|
185
210
|
...(author === '' ? {} : { author }),
|
|
211
|
+
...(owner === '' ? {} : { owner }),
|
|
186
212
|
...(homepage === '' ? {} : { homepage }),
|
|
187
213
|
...(icon === '' ? {} : { icon }),
|
|
188
214
|
...(metadata === undefined ? {} : { metadata }),
|
|
@@ -259,8 +285,14 @@ export function upsertMarketEntry(index, entry) {
|
|
|
259
285
|
merged.set(one.version, one);
|
|
260
286
|
for (const one of entry.versions)
|
|
261
287
|
merged.set(one.version, one);
|
|
288
|
+
const owner = current.owner ?? entry.owner;
|
|
262
289
|
const plugins = [...index.plugins];
|
|
263
|
-
plugins[found] = {
|
|
290
|
+
plugins[found] = {
|
|
291
|
+
...current,
|
|
292
|
+
...entry,
|
|
293
|
+
...(owner === undefined ? {} : { owner }),
|
|
294
|
+
versions: sortMarketVersions([...merged.values()]),
|
|
295
|
+
};
|
|
264
296
|
return { ...index, plugins };
|
|
265
297
|
}
|
|
266
298
|
export function marketEntryLabels(entry) {
|
package/dist/host.d.ts
CHANGED
|
@@ -15,6 +15,7 @@ export * from './contract/long-task.js';
|
|
|
15
15
|
export * from './lib/text.js';
|
|
16
16
|
export * from './lib/ui.js';
|
|
17
17
|
export * from './lib/board-fact.js';
|
|
18
|
+
export * from './lib/git-address.js';
|
|
18
19
|
export * from './api/blocker-table.js';
|
|
19
20
|
export * from './contract/unit-declaration.js';
|
|
20
21
|
export * from './host/board-fact.js';
|
|
@@ -72,4 +73,5 @@ export * from './host/extension.js';
|
|
|
72
73
|
export * from './host/port-types.js';
|
|
73
74
|
export * from './host/version-range.js';
|
|
74
75
|
export * from './host/market-index.js';
|
|
76
|
+
export * from './host/market-index-claim.js';
|
|
75
77
|
export * from './host/changelog.js';
|
package/dist/host.js
CHANGED
|
@@ -15,6 +15,7 @@ export * from './contract/long-task.js';
|
|
|
15
15
|
export * from './lib/text.js';
|
|
16
16
|
export * from './lib/ui.js';
|
|
17
17
|
export * from './lib/board-fact.js';
|
|
18
|
+
export * from './lib/git-address.js';
|
|
18
19
|
export * from './api/blocker-table.js';
|
|
19
20
|
export * from './contract/unit-declaration.js';
|
|
20
21
|
export * from './host/board-fact.js';
|
|
@@ -72,4 +73,5 @@ export * from './host/extension.js';
|
|
|
72
73
|
export * from './host/port-types.js';
|
|
73
74
|
export * from './host/version-range.js';
|
|
74
75
|
export * from './host/market-index.js';
|
|
76
|
+
export * from './host/market-index-claim.js';
|
|
75
77
|
export * from './host/changelog.js';
|
package/dist/i18n/en.js
CHANGED
|
@@ -248,6 +248,7 @@ export const en = {
|
|
|
248
248
|
'panels.market.add.failurePnpmMissing': 'pnpm was not found, cannot install',
|
|
249
249
|
'panels.market.add.failureInstalled': 'It is already installed in this workbench. The same package cannot be installed over itself: uninstall it first, then install again. The uninstall did not succeed this time.',
|
|
250
250
|
'panels.market.add.failureGeneric': 'Something went wrong during install — see the install details',
|
|
251
|
+
'panels.market.add.failureCredentials': 'This repository needs credentials: this machine has none for it. Clone it once in a terminal, set up a credential helper, or install from the SSH address.',
|
|
251
252
|
'panels.market.add.approveTitle': 'Your approval is needed for install scripts',
|
|
252
253
|
'panels.market.add.approveCaution': 'Only allow packages you trust: install scripts run on this machine with your permissions.',
|
|
253
254
|
'panels.market.add.approveRun': 'Allow and continue installing',
|
|
@@ -289,10 +290,16 @@ export const en = {
|
|
|
289
290
|
'panels.discover.addingSource': 'Adding…',
|
|
290
291
|
'panels.discover.addFirstSource': 'Add index source',
|
|
291
292
|
'panels.discover.removeSource': 'Remove',
|
|
292
|
-
'panels.discover.
|
|
293
|
-
'panels.discover.
|
|
294
|
-
'panels.discover.
|
|
295
|
-
'panels.discover.
|
|
293
|
+
'panels.discover.removeTitle': 'Remove this index source?',
|
|
294
|
+
'panels.discover.removeBody': '"{label}" will be removed from this list; the repository itself is not deleted, and you can add it back later.',
|
|
295
|
+
'panels.discover.sourceActions': 'Actions for {label}',
|
|
296
|
+
'panels.discover.sourceStateWritable': 'Publish target',
|
|
297
|
+
'panels.discover.sourceStateReadOnly': 'Read-only list',
|
|
298
|
+
'panels.discover.sourceEnable': 'Set up for publishing',
|
|
299
|
+
'panels.discover.sourceDisable': 'Set to read-only',
|
|
300
|
+
'panels.discover.sourceWorking': 'Updating…',
|
|
301
|
+
'panels.discover.sourceEnabled': '"{label}" is ready for publishing',
|
|
302
|
+
'panels.discover.sourceReadOnly': '"{label}" is now read-only',
|
|
296
303
|
'panels.discover.refresh': 'Refresh',
|
|
297
304
|
'panels.discover.search': 'Search modules',
|
|
298
305
|
'panels.discover.clearSearch': 'Clear search',
|
|
@@ -314,12 +321,13 @@ export const en = {
|
|
|
314
321
|
'panels.discover.noSourceHint': 'Add a module market index (http address or git repository) to browse and install its modules here',
|
|
315
322
|
'panels.discover.sourcesFailed': 'Could not read the index sources.',
|
|
316
323
|
'panels.discover.unreadable': 'Could not read this index.',
|
|
324
|
+
'panels.discover.sourceAuth': 'This index source could not be read: this machine has no git credentials for it. Set up credentials (or switch the source to its SSH address), then refresh.',
|
|
317
325
|
'panels.discover.invalid': 'This index is not in a valid format.',
|
|
318
326
|
'panels.discover.emptyRepo': 'This repository has no commits yet.',
|
|
319
327
|
'panels.discover.missingIndex': 'This repository has no {path} yet.',
|
|
320
328
|
'panels.discover.initTitle': 'Initialize this repository as a module market index?',
|
|
321
329
|
'panels.discover.initCta': 'Initialize market index',
|
|
322
|
-
'panels.discover.initWhat': 'It will write market.json and README.md on {branch}, commit once, and push. Modules you publish from this workbench will commit their build files under packages/<
|
|
330
|
+
'panels.discover.initWhat': 'It will write market.json and README.md on {branch}, commit once, and push. Modules you publish from this workbench will commit their build files under packages/<package-name>/. The repository stays owned by its owner.',
|
|
323
331
|
'panels.discover.initBranch': 'Branch',
|
|
324
332
|
'panels.discover.initBranchHint': 'The index and build files go to this branch; an empty repository gets it created.',
|
|
325
333
|
'panels.discover.initBranchBad': 'Use only letters, digits, dots, underscores, slashes, or dashes in a branch name.',
|
|
@@ -337,8 +345,23 @@ export const en = {
|
|
|
337
345
|
'panels.discover.badShellDetail': 'This version is not compatible with the running workbench {current}; it requires {peer}',
|
|
338
346
|
'panels.discover.unverified': 'Workbench unverified',
|
|
339
347
|
'panels.discover.installing': 'Installing…',
|
|
348
|
+
'panels.discover.installingNamed': 'Installing {name}…',
|
|
349
|
+
'panels.discover.cancelInstall': 'Cancel install',
|
|
350
|
+
'panels.discover.cancelling': 'Cancelling…',
|
|
351
|
+
'panels.discover.installCancelled': 'Install cancelled: {name}',
|
|
340
352
|
'panels.discover.installedDone': 'Installed: {name}',
|
|
341
353
|
'panels.discover.failed': 'Failed: {reason}',
|
|
354
|
+
'panels.discover.transportTitle': 'Where to read this repository',
|
|
355
|
+
'panels.discover.transportSsh': 'SSH',
|
|
356
|
+
'panels.discover.transportHttps': 'HTTPS',
|
|
357
|
+
'panels.discover.transportOk': 'Readable',
|
|
358
|
+
'panels.discover.transportAuth': 'Needs credentials',
|
|
359
|
+
'panels.discover.transportUnreachable': 'Unreachable',
|
|
360
|
+
'panels.discover.transportUnknown': 'Not probed',
|
|
361
|
+
'panels.discover.transportChecking': 'Checking…',
|
|
362
|
+
'panels.discover.transportTest': 'Test this address',
|
|
363
|
+
'panels.discover.transportPlaceholder': 'Or paste another address (mirror, alias)',
|
|
364
|
+
'panels.discover.transportNeedsAuth': 'This repository needs credentials: clone it once in a terminal, or set up an SSH key / credential helper, then install again.',
|
|
342
365
|
'panels.discover.expand': 'Show versions',
|
|
343
366
|
'panels.discover.collapse': 'Hide versions',
|
|
344
367
|
'panels.discover.versionCount': '{n} versions',
|
|
@@ -629,6 +652,13 @@ export const en = {
|
|
|
629
652
|
'approval.publish.version': 'Version',
|
|
630
653
|
'approval.publish.author': 'Author',
|
|
631
654
|
'approval.publish.authorMissing': 'unsigned',
|
|
655
|
+
'approval.publish.owner': 'Owner',
|
|
656
|
+
'approval.publish.ownerUnowned': 'originally unattributed',
|
|
657
|
+
'approval.publish.ownerTaken': 'Owned by {owner}',
|
|
658
|
+
'approval.publish.unit': 'Module id',
|
|
659
|
+
'approval.publish.unitTaken': 'Taken by {entry}',
|
|
660
|
+
'approval.publish.path': 'Artifact dir',
|
|
661
|
+
'approval.publish.pathTaken': 'Taken by {entry}',
|
|
632
662
|
'approval.publish.registry': 'Registry',
|
|
633
663
|
'approval.publish.repo': 'Repository',
|
|
634
664
|
'approval.publish.branch': 'Branch',
|
|
@@ -639,6 +669,7 @@ export const en = {
|
|
|
639
669
|
'approval.publish.twoCommits': 'build files + market.json in 2 commits, one push',
|
|
640
670
|
'approval.publish.reading': 'Reading…',
|
|
641
671
|
'approval.publish.changelog': 'Changelog for {version}',
|
|
672
|
+
'approval.publish.changelogPending': 'This release writes the {version} changelog entry',
|
|
642
673
|
'approval.publish.changelogMissing': 'No changelog entry for {version}; publishing will be blocked',
|
|
643
674
|
'approval.publish.targetAuto': 'configured default',
|
|
644
675
|
'approval.publish.targetTeam': 'team registry',
|
|
@@ -647,6 +678,15 @@ export const en = {
|
|
|
647
678
|
'approval.publish.targetGit': 'git repository',
|
|
648
679
|
'approval.publish.targetMarket': 'module market index',
|
|
649
680
|
'approval.publish.targetLocal': 'keep local',
|
|
681
|
+
'approval.market.source': 'Index source',
|
|
682
|
+
'approval.market.url': 'URL',
|
|
683
|
+
'approval.market.action': 'This action',
|
|
684
|
+
'approval.market.policy': 'Current state',
|
|
685
|
+
'approval.market.enable': 'make it publishable',
|
|
686
|
+
'approval.market.disable': 'make it read-only',
|
|
687
|
+
'approval.market.writable': 'publishable',
|
|
688
|
+
'approval.market.readOnly': 'read-only module list',
|
|
689
|
+
'approval.market.reading': 'Reading…',
|
|
650
690
|
'markdown.copy': 'Copy',
|
|
651
691
|
'markdown.copied': 'Copied',
|
|
652
692
|
'markdown.footnotes': 'Footnotes',
|