@starci/eslint-canon-fe 9.13.2 → 9.13.4
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/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 9.13.4 - 2026-11-04
|
|
4
|
+
|
|
5
|
+
- Changed: the runtime copy of the canon pins names the release-6 versions.
|
|
6
|
+
|
|
7
|
+
## 9.13.3 - 2026-11-04
|
|
8
|
+
|
|
9
|
+
- Changed: the runtime copies carry `engine/runtime-root.mjs`, which moves an installed copy's legacy state with its owner and mode (`@starci/hfs` 5.6.1), and the release-5 canon pins.
|
|
10
|
+
|
|
3
11
|
## 9.13.2 - 2026-11-04
|
|
4
12
|
|
|
5
13
|
- Changed: the runtime copies carry `engine/runtime-root.mjs` with the per-user state base of an installed copy (`@starci/hfs` 5.6.0) and the canon pins of release 4 (`@starci/auth` 0.4.0, `@starci/auth-oidc` 0.1.3).
|
package/package.json
CHANGED
|
@@ -58,10 +58,36 @@ export class LegacyStateHeld extends Error {
|
|
|
58
58
|
}
|
|
59
59
|
const HELD = new Set(['EPERM', 'EBUSY', 'EACCES']);
|
|
60
60
|
const isHeld = (error) => HELD.has(String(error?.code));
|
|
61
|
+
/** Gives `to` and everything below it the mode, owner and group of the matching entry of `from` (a copy keeps neither on its own). */
|
|
62
|
+
function keepOwnership(from, to) {
|
|
63
|
+
const source = fs.lstatSync(from);
|
|
64
|
+
const target = fs.lstatSync(to);
|
|
65
|
+
if (!source.isSymbolicLink())
|
|
66
|
+
fs.chmodSync(to, source.mode & 0o7777);
|
|
67
|
+
if (source.uid !== target.uid || source.gid !== target.gid)
|
|
68
|
+
fs.lchownSync(to, source.uid, source.gid);
|
|
69
|
+
if (source.isDirectory())
|
|
70
|
+
for (const name of fs.readdirSync(from))
|
|
71
|
+
keepOwnership(path.join(from, name), path.join(to, name));
|
|
72
|
+
}
|
|
73
|
+
/** Moves one entry by rename, which keeps its owner and mode; across volumes (EXDEV) it is copied, its ownership restored, then removed. */
|
|
74
|
+
function moveEntry(from, to) {
|
|
75
|
+
try {
|
|
76
|
+
fs.renameSync(from, to);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
if (error?.code !== 'EXDEV')
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
fs.cpSync(from, to, { recursive: true, verbatimSymlinks: true, errorOnExist: true, force: false });
|
|
84
|
+
keepOwnership(from, to);
|
|
85
|
+
fs.rmSync(from, { recursive: true, force: true });
|
|
86
|
+
}
|
|
61
87
|
/**
|
|
62
88
|
* Moves the state an installed copy kept inside itself (<copy>/.runtime, before installedStateBase) out to the state base, once: the
|
|
63
|
-
* folder is first renamed to <copy>/.runtime.adopting (a rename a running stack's open files refuse, LegacyStateHeld), then
|
|
64
|
-
*
|
|
89
|
+
* folder is first renamed to <copy>/.runtime.adopting (a rename a running stack's open files refuse, LegacyStateHeld), then each entry
|
|
90
|
+
* is moved with its owner and mode (a bind folder a container user owns stays that user's) and the folder removed. An entry the state base already holds is kept beside it under legacy-<stamp>/, never overwritten. An
|
|
65
91
|
* interrupted adoption resumes from .runtime.adopting. Null when there is nothing to adopt: a checkout, LOCAL_ROOT_ENV set, or no
|
|
66
92
|
* legacy folder.
|
|
67
93
|
*/
|
|
@@ -88,7 +114,8 @@ export function adoptLegacyState(env = process.env, root = skillRoot, now = () =
|
|
|
88
114
|
const kept = [];
|
|
89
115
|
for (const name of fs.readdirSync(parked).sort()) {
|
|
90
116
|
const taken = fs.existsSync(path.join(to, name));
|
|
91
|
-
fs.
|
|
117
|
+
fs.mkdirSync(taken ? aside : to, { recursive: true });
|
|
118
|
+
moveEntry(path.join(parked, name), path.join(taken ? aside : to, name));
|
|
92
119
|
(taken ? kept : moved).push(name);
|
|
93
120
|
}
|
|
94
121
|
fs.rmSync(parked, { recursive: true, force: true });
|
|
@@ -38,7 +38,7 @@ pins:
|
|
|
38
38
|
source: packages/next-data/package.json
|
|
39
39
|
why: 'the SWR data helpers of every front end (fe-stack data, owner:next-data-package): pollingRestart, the viewer and tenant key helpers, viewerSwrConfig and the viewer cache; each operation hook stays in the app and the package holds no component.'
|
|
40
40
|
'@starci/grammar':
|
|
41
|
-
version: 0.21.
|
|
41
|
+
version: 0.21.21
|
|
42
42
|
group: starci
|
|
43
43
|
install: registry
|
|
44
44
|
side: fe
|
|
@@ -52,28 +52,28 @@ pins:
|
|
|
52
52
|
source: packages/next-i18n/package.json
|
|
53
53
|
why: 'the next-intl stack of every front end (fe-stack i18n, owner:next-i18n-package): defineI18n over the locales of the app, the locale-negotiating proxy, the locale-aware navigation, the request config that loads the catalogs of the app and the locale read of the [locale] layout; the app keeps its message catalogs and writes none of the stack.'
|
|
54
54
|
'@starci/eslint-canon-be':
|
|
55
|
-
version: 3.15.
|
|
55
|
+
version: 3.15.4
|
|
56
56
|
group: starci
|
|
57
57
|
install: registry
|
|
58
58
|
side: be
|
|
59
59
|
source: packages/eslint-canon-be/package.json
|
|
60
60
|
why: 'the back-end ESLint canon: `loadHfs(import.meta.url)` of be/eslint.config.mjs finds the app-root hfs.json (kind app) and gives every linted file the view of the be side, and the project graph is built per side; its bundled runtime copies (slots, canon-pins, failure codes, the architecture machine) put .starcistacks and .sops.yaml at the app root; `starciBeConfig({ hfs: loadHfs(import.meta.url) })` is the typed factory and the BE-CONVENTION laws are its rules.'
|
|
61
61
|
'@starci/eslint-canon-fe':
|
|
62
|
-
version: 9.13.
|
|
62
|
+
version: 9.13.4
|
|
63
63
|
group: starci
|
|
64
64
|
install: registry
|
|
65
65
|
side: fe
|
|
66
66
|
source: packages/eslint-canon-fe/package.json
|
|
67
67
|
why: 'the front-end ESLint canon: `loadHfs(import.meta.url)` of fe/eslint.config.mjs finds the app-root hfs.json (kind app) and gives every linted file the view of the fe side, and the project graph is built per side; its bundled runtime copies (slots, canon-pins, failure codes, the architecture machine) put .starcistacks and .sops.yaml at the app root; the front end has no tests (FE_NO_TESTS R97 in hfs) and no-vietnamese-in-source (R91) applies.'
|
|
68
68
|
'@starci/eslint-grammar-core':
|
|
69
|
-
version: 0.21.
|
|
69
|
+
version: 0.21.21
|
|
70
70
|
group: starci
|
|
71
71
|
install: registry
|
|
72
72
|
side: fe
|
|
73
73
|
source: packages/eslint-grammar-core/package.json
|
|
74
74
|
why: 'the StarCi Grammar component API lint, versioned with @starci/grammar; front ends compose this family package with the universal FE canon.'
|
|
75
75
|
'@starci/eslint-grammar-offset-pop':
|
|
76
|
-
version: 0.21.
|
|
76
|
+
version: 0.21.21
|
|
77
77
|
group: starci
|
|
78
78
|
install: registry
|
|
79
79
|
side: fe
|
|
@@ -155,7 +155,7 @@ pins:
|
|
|
155
155
|
source: packages/mail/package.json
|
|
156
156
|
why: 'outgoing mail of a back end: a NestJS module and the Mailer port over SMTP (connect, greeting, socket and total timeouts, STARTTLS required by default, recipient, message and attachment checks, a shared SMTP target policy, coded errors, typed escaping render helpers returning { subject, text, html }), with @starci/mail/testing for its specs; the only importer of nodemailer (R90).'
|
|
157
157
|
'@starci/hfs':
|
|
158
|
-
version: 5.
|
|
158
|
+
version: 5.7.0
|
|
159
159
|
group: starci
|
|
160
160
|
install: registry
|
|
161
161
|
side: both
|