@microwiseai/snapshot 0.3.69 → 0.3.70-dev.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.
- package/dist/commands/access.d.ts.map +1 -1
- package/dist/commands/access.js +6 -0
- package/dist/commands/access.js.map +1 -1
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +8 -1
- package/dist/commands/publish.js.map +1 -1
- package/dist/lib/access-sync.d.ts +32 -0
- package/dist/lib/access-sync.d.ts.map +1 -1
- package/dist/lib/access-sync.js +49 -3
- package/dist/lib/access-sync.js.map +1 -1
- package/dist/lib/access-sync.test.js +116 -4
- package/dist/lib/access-sync.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../../src/commands/access.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../../src/commands/access.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,UAAU,iBAAiB;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AA0BD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAwCf"}
|
package/dist/commands/access.js
CHANGED
|
@@ -8,6 +8,7 @@ import { readFile } from 'node:fs/promises';
|
|
|
8
8
|
import { join, resolve } from 'node:path';
|
|
9
9
|
import chalk from 'chalk';
|
|
10
10
|
import { syncPackageAccess } from '../lib/access-sync.js';
|
|
11
|
+
import { getGitlabToken } from '../lib/config.js';
|
|
11
12
|
/**
|
|
12
13
|
* Read snapshot.json from given path or current directory
|
|
13
14
|
*/
|
|
@@ -46,10 +47,15 @@ export async function accessSyncCommand(snapshotPath, options = {}) {
|
|
|
46
47
|
return;
|
|
47
48
|
}
|
|
48
49
|
console.log(chalk.dim(` Snapshot: ${snapshot.name} v${snapshot.version}`));
|
|
50
|
+
// Pass the GitLab token (gitlab-publish's token) so namespace-ownership auth
|
|
51
|
+
// can be used. Whether it is sent depends on the resolved auth mode
|
|
52
|
+
// (default 'admin-key' preserves legacy behavior until license-side cutover).
|
|
53
|
+
const gitlabToken = getGitlabToken();
|
|
49
54
|
const result = await syncPackageAccess(snapshot, {
|
|
50
55
|
verbose,
|
|
51
56
|
dryRun,
|
|
52
57
|
includeTransitive: !skipTransitive,
|
|
58
|
+
gitlabToken,
|
|
53
59
|
});
|
|
54
60
|
if (result.success) {
|
|
55
61
|
console.log(chalk.green('\n✓ Access sync completed!'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access.js","sourceRoot":"","sources":["../../src/commands/access.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"access.js","sourceRoot":"","sources":["../../src/commands/access.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAQlD;;GAEG;AACH,KAAK,UAAU,YAAY,CAAC,YAAqB;IAC/C,MAAM,UAAU,GAAG,YAAY;QAC7B,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;QACvB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;IAEzC,+CAA+C;IAC/C,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC5C,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAa,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7G,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,YAAqB,EACrB,UAA6B,EAAE;IAE/B,MAAM,EAAE,OAAO,GAAG,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,cAAc,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAE5E,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;QAElD,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iDAAiD,CAAC,CAAC,CAAC;YAC7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8GAA8G,CAAC,CAAC,CAAC;YACvI,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAE5E,6EAA6E;QAC7E,oEAAoE;QACpE,8EAA8E;QAC9E,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE;YAC/C,OAAO;YACP,MAAM;YACN,iBAAiB,EAAE,CAAC,cAAc;YAClC,WAAW;SACZ,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAQA,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAsED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAgE3E"}
|
package/dist/commands/publish.js
CHANGED
|
@@ -3,6 +3,7 @@ import { access, readFile } from 'node:fs/promises';
|
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import chalk from 'chalk';
|
|
5
5
|
import { syncPackageAccess } from '../lib/access-sync.js';
|
|
6
|
+
import { getGitlabToken } from '../lib/config.js';
|
|
6
7
|
/**
|
|
7
8
|
* Read and parse snapshot.json from current directory
|
|
8
9
|
*/
|
|
@@ -106,7 +107,13 @@ export async function publishCommand(options) {
|
|
|
106
107
|
}
|
|
107
108
|
// Sync package access with license-api
|
|
108
109
|
if (!skipAccessSync && snapshot.access) {
|
|
109
|
-
|
|
110
|
+
// Reuse the GitLab token that gitlab-publish already used (step 1) so the
|
|
111
|
+
// access-rule write (step 2) can be authenticated by GitLab namespace
|
|
112
|
+
// ownership instead of a shared admin key. Passed unconditionally; whether
|
|
113
|
+
// it is actually used depends on the resolved auth mode (default
|
|
114
|
+
// 'admin-key' keeps current behavior until the license-side cutover).
|
|
115
|
+
const gitlabToken = getGitlabToken();
|
|
116
|
+
await syncPackageAccess(snapshot, { verbose, dryRun, gitlabToken });
|
|
110
117
|
}
|
|
111
118
|
else if (!snapshot.access && verbose) {
|
|
112
119
|
console.log(chalk.dim('\n Skipping access sync (no access field in snapshot.json)'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AASlD;;GAEG;AACH,KAAK,UAAU,gBAAgB;IAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAa,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7G,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB;IAC9B,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAAC,OAAuB;IACnD,MAAM,IAAI,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAE5C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,gBAAgB,EAAE,IAAI,EAAE;YAC1C,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,qCAAqC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,mCAAmC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAuB;IAC1D,MAAM,EAAE,OAAO,GAAG,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,cAAc,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAElF,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAE1D,IAAI,CAAC;QACH,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,iBAAiB,EAAE,CAAC;QAE1B,MAAM,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAE1C,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC3D,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACxH,CAAC;QACH,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAAC,CAAC;YACrE,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/C,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;gBACtD,IAAI,IAAI,EAAE,CAAC;oBACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;YAE9B,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC9D,CAAC;QAED,uCAAuC;QACvC,IAAI,CAAC,cAAc,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACvC,0EAA0E;YAC1E,sEAAsE;YACtE,2EAA2E;YAC3E,iEAAiE;YACjE,sEAAsE;YACtE,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;YACrC,MAAM,iBAAiB,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QACtE,CAAC;aAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC,CAAC;QACxF,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -5,6 +5,28 @@
|
|
|
5
5
|
* in the snapshot's install list with the appropriate access level.
|
|
6
6
|
*/
|
|
7
7
|
import type { Snapshot } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* How access-sync authenticates write calls to license-api.
|
|
10
|
+
*
|
|
11
|
+
* The long-term SSOT (snapshot-publish-auth-design, 2026-06-04) is GitLab
|
|
12
|
+
* namespace ownership: the publisher proves they own the `@scope` namespace by
|
|
13
|
+
* presenting their GitLab token as `Authorization: Bearer`, and license-api
|
|
14
|
+
* (verifyNamespaceOwnership) cross-checks ownership before allowing the write.
|
|
15
|
+
*
|
|
16
|
+
* STAGE2 cutover: GitLab namespace ownership is now the DEFAULT. license-api
|
|
17
|
+
* (verifyNamespaceOwnership) is live in production and accepts the GitLab token
|
|
18
|
+
* (state: license-namespace-ownership-status). The legacy shared
|
|
19
|
+
* `X-Admin-Api-Key` path is still selectable for the transition but is no
|
|
20
|
+
* longer the default; it is slated for removal once license-api drops
|
|
21
|
+
* admin-key acceptance (license STAGE2). Modes:
|
|
22
|
+
* - 'gitlab' (default) — GitLab token Bearer only. Namespace-ownership SSOT.
|
|
23
|
+
* - 'admin-key' — legacy shared key only (transitional fallback).
|
|
24
|
+
* - 'dual' — send BOTH headers during the transition window so
|
|
25
|
+
* either side of the cutover can authenticate.
|
|
26
|
+
*
|
|
27
|
+
* Selected via the `authMode` option or the SNAPSHOT_ACCESS_AUTH_MODE env var.
|
|
28
|
+
*/
|
|
29
|
+
export type AccessSyncAuthMode = 'admin-key' | 'gitlab' | 'dual';
|
|
8
30
|
interface SyncResult {
|
|
9
31
|
success: boolean;
|
|
10
32
|
registered: string[];
|
|
@@ -21,6 +43,16 @@ export declare function syncPackageAccess(snapshot: Snapshot, options?: {
|
|
|
21
43
|
verbose?: boolean;
|
|
22
44
|
dryRun?: boolean;
|
|
23
45
|
includeTransitive?: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* GitLab token (same one gitlab-publish uses) for namespace-ownership auth.
|
|
48
|
+
* Required when the resolved auth mode is 'gitlab' or 'dual'.
|
|
49
|
+
*/
|
|
50
|
+
gitlabToken?: string | null;
|
|
51
|
+
/**
|
|
52
|
+
* Override the auth mode. Defaults to SNAPSHOT_ACCESS_AUTH_MODE env, else
|
|
53
|
+
* 'gitlab' (STAGE2: GitLab namespace-ownership Bearer auth).
|
|
54
|
+
*/
|
|
55
|
+
authMode?: AccessSyncAuthMode;
|
|
24
56
|
}): Promise<SyncResult>;
|
|
25
57
|
export {};
|
|
26
58
|
//# sourceMappingURL=access-sync.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access-sync.d.ts","sourceRoot":"","sources":["../../src/lib/access-sync.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"access-sync.d.ts","sourceRoot":"","sources":["../../src/lib/access-sync.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,YAAY,CAAC;AAoB3D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;AAoEjE,UAAU,UAAU;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAwJD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CAC1B,GACL,OAAO,CAAC,UAAU,CAAC,CAsHrB"}
|
package/dist/lib/access-sync.js
CHANGED
|
@@ -20,6 +20,45 @@ function getAdminApiKey() {
|
|
|
20
20
|
}
|
|
21
21
|
return key;
|
|
22
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Resolve the effective auth mode.
|
|
25
|
+
* Precedence: explicit option > SNAPSHOT_ACCESS_AUTH_MODE env > 'gitlab'.
|
|
26
|
+
* Default is 'gitlab' (STAGE2 cutover): access-rule writes authenticate via
|
|
27
|
+
* GitLab namespace ownership. Set authMode/env to 'admin-key' or 'dual' for the
|
|
28
|
+
* transitional legacy path.
|
|
29
|
+
*/
|
|
30
|
+
function resolveAuthMode(explicit) {
|
|
31
|
+
const candidate = explicit ?? process.env.SNAPSHOT_ACCESS_AUTH_MODE;
|
|
32
|
+
if (candidate === 'gitlab' || candidate === 'dual' || candidate === 'admin-key') {
|
|
33
|
+
return candidate;
|
|
34
|
+
}
|
|
35
|
+
if (candidate) {
|
|
36
|
+
console.warn(chalk.yellow(` Warning: unknown SNAPSHOT_ACCESS_AUTH_MODE "${candidate}", falling back to "gitlab".`));
|
|
37
|
+
}
|
|
38
|
+
return 'gitlab';
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Build the auth headers for a license-api write call from the resolved auth
|
|
42
|
+
* context. Throws loudly when a required credential is missing — fail-closed,
|
|
43
|
+
* never silently drop authentication.
|
|
44
|
+
*/
|
|
45
|
+
function buildAuthHeaders(auth) {
|
|
46
|
+
const headers = {};
|
|
47
|
+
const needsGitlab = auth.mode === 'gitlab' || auth.mode === 'dual';
|
|
48
|
+
const needsAdminKey = auth.mode === 'admin-key' || auth.mode === 'dual';
|
|
49
|
+
if (needsGitlab) {
|
|
50
|
+
if (!auth.gitlabToken) {
|
|
51
|
+
throw new Error(`Access sync auth mode "${auth.mode}" requires a GitLab token but none was provided. ` +
|
|
52
|
+
'Ensure gitlab-config is set or GITLAB_TOKEN is exported (the same token used by gitlab-publish).');
|
|
53
|
+
}
|
|
54
|
+
headers['Authorization'] = `Bearer ${auth.gitlabToken}`;
|
|
55
|
+
}
|
|
56
|
+
if (needsAdminKey) {
|
|
57
|
+
// getAdminApiKey() throws loudly if LICENSE_API_ADMIN_KEY is unset.
|
|
58
|
+
headers['X-Admin-Api-Key'] = getAdminApiKey();
|
|
59
|
+
}
|
|
60
|
+
return headers;
|
|
61
|
+
}
|
|
23
62
|
/**
|
|
24
63
|
* Parse package name into scope and name
|
|
25
64
|
* @example "@ist/loggable-cli" -> { scope: "@ist", name: "loggable-cli" }
|
|
@@ -66,7 +105,7 @@ function getProductId(access) {
|
|
|
66
105
|
* server-side automatic dependency resolution must be disabled to avoid
|
|
67
106
|
* duplicate/conflicting rule creation.
|
|
68
107
|
*/
|
|
69
|
-
async function registerPackage(rule) {
|
|
108
|
+
async function registerPackage(rule, authHeaders) {
|
|
70
109
|
try {
|
|
71
110
|
const body = {
|
|
72
111
|
scope: rule.scope,
|
|
@@ -85,7 +124,7 @@ async function registerPackage(rule) {
|
|
|
85
124
|
method: 'POST',
|
|
86
125
|
headers: {
|
|
87
126
|
'Content-Type': 'application/json',
|
|
88
|
-
|
|
127
|
+
...authHeaders,
|
|
89
128
|
},
|
|
90
129
|
body: JSON.stringify(body),
|
|
91
130
|
});
|
|
@@ -169,8 +208,15 @@ export async function syncPackageAccess(snapshot, options = {}) {
|
|
|
169
208
|
};
|
|
170
209
|
const accessLevel = getAccessLevel(snapshot.access);
|
|
171
210
|
const productId = getProductId(snapshot.access);
|
|
211
|
+
// Resolve auth ONCE up front so a missing credential fails loudly before any
|
|
212
|
+
// partial writes happen. Skipped in dry-run (no network calls are made).
|
|
213
|
+
const authMode = resolveAuthMode(options.authMode);
|
|
214
|
+
const authHeaders = dryRun
|
|
215
|
+
? {}
|
|
216
|
+
: buildAuthHeaders({ mode: authMode, gitlabToken: options.gitlabToken });
|
|
172
217
|
console.log(chalk.cyan(`\nSyncing package access for ${snapshot.name}...`));
|
|
173
218
|
console.log(chalk.dim(` Access level: ${accessLevel}`));
|
|
219
|
+
console.log(chalk.dim(` Auth mode: ${authMode}`));
|
|
174
220
|
// 1. Extract direct packages from snapshot
|
|
175
221
|
const directPackages = extractPackagesFromSnapshot(snapshot);
|
|
176
222
|
if (verbose) {
|
|
@@ -227,7 +273,7 @@ export async function syncPackageAccess(snapshot, options = {}) {
|
|
|
227
273
|
result.registered.push(pkg);
|
|
228
274
|
}
|
|
229
275
|
else {
|
|
230
|
-
const success = await registerPackage(rule);
|
|
276
|
+
const success = await registerPackage(rule, authHeaders);
|
|
231
277
|
if (success) {
|
|
232
278
|
result.registered.push(pkg);
|
|
233
279
|
if (verbose) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access-sync.js","sourceRoot":"","sources":["../../src/lib/access-sync.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEnF;;;;;GAKG;AACH,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAC9C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,kFAAkF;YAChF,oCAAoC,CACvC,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAmBD;;;GAGG;AACH,SAAS,gBAAgB,CAAC,QAAgB;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,MAAkC;IACxD,IAAI,CAAC,MAAM;QAAE,OAAO,UAAU,CAAC,CAAC,sBAAsB;IACtD,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACzC,IAAI,MAAM,KAAK,eAAe;QAAE,OAAO,eAAe,CAAC;IACvD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IAChF,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,MAAkC;IACtD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC7D,OAAO,MAAM,CAAC,SAAS,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,KAAK,UAAU,eAAe,
|
|
1
|
+
{"version":3,"file":"access-sync.js","sourceRoot":"","sources":["../../src/lib/access-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,12 @@ function upsertBodies(fetchMock) {
|
|
|
21
21
|
.filter((call) => call[0] === UPSERT_URL)
|
|
22
22
|
.map((call) => JSON.parse(call[1].body));
|
|
23
23
|
}
|
|
24
|
+
/** Extract the headers of every upsert call recorded by the fetch mock. */
|
|
25
|
+
function upsertHeaders(fetchMock) {
|
|
26
|
+
return fetchMock.mock.calls
|
|
27
|
+
.filter((call) => call[0] === UPSERT_URL)
|
|
28
|
+
.map((call) => call[1].headers);
|
|
29
|
+
}
|
|
24
30
|
describe('syncPackageAccess - snapshot own package registration', () => {
|
|
25
31
|
let originalFetch;
|
|
26
32
|
beforeEach(() => {
|
|
@@ -47,7 +53,7 @@ describe('syncPackageAccess - snapshot own package registration', () => {
|
|
|
47
53
|
},
|
|
48
54
|
},
|
|
49
55
|
};
|
|
50
|
-
const result = await syncPackageAccess(snapshot, { includeTransitive: false });
|
|
56
|
+
const result = await syncPackageAccess(snapshot, { includeTransitive: false, gitlabToken: 'glpat-test' });
|
|
51
57
|
const bodies = upsertBodies(fetchMock);
|
|
52
58
|
const self = bodies.find((b) => b.scope === '@ist' && b.packageName === 'testing');
|
|
53
59
|
expect(self).toBeDefined();
|
|
@@ -71,7 +77,7 @@ describe('syncPackageAccess - snapshot own package registration', () => {
|
|
|
71
77
|
access: 'public',
|
|
72
78
|
install: {},
|
|
73
79
|
};
|
|
74
|
-
await syncPackageAccess(snapshot, { includeTransitive: false });
|
|
80
|
+
await syncPackageAccess(snapshot, { includeTransitive: false, gitlabToken: 'glpat-test' });
|
|
75
81
|
const self = upsertBodies(fetchMock).find((b) => b.packageName === 'free');
|
|
76
82
|
expect(self).toBeDefined();
|
|
77
83
|
expect(self.accessLevel).toBe('public');
|
|
@@ -85,7 +91,7 @@ describe('syncPackageAccess - snapshot own package registration', () => {
|
|
|
85
91
|
access: { type: 'licensed', productId: 'prod_123' },
|
|
86
92
|
install: {},
|
|
87
93
|
};
|
|
88
|
-
await syncPackageAccess(snapshot, { includeTransitive: false });
|
|
94
|
+
await syncPackageAccess(snapshot, { includeTransitive: false, gitlabToken: 'glpat-test' });
|
|
89
95
|
const self = upsertBodies(fetchMock).find((b) => b.packageName === 'pro');
|
|
90
96
|
expect(self).toBeDefined();
|
|
91
97
|
expect(self.accessLevel).toBe('licensed');
|
|
@@ -104,9 +110,115 @@ describe('syncPackageAccess - snapshot own package registration', () => {
|
|
|
104
110
|
},
|
|
105
111
|
},
|
|
106
112
|
};
|
|
107
|
-
await syncPackageAccess(snapshot, { includeTransitive: false });
|
|
113
|
+
await syncPackageAccess(snapshot, { includeTransitive: false, gitlabToken: 'glpat-test' });
|
|
108
114
|
const selfHits = upsertBodies(fetchMock).filter((b) => b.scope === '@ist' && b.packageName === 'testing');
|
|
109
115
|
expect(selfHits).toHaveLength(1);
|
|
110
116
|
});
|
|
111
117
|
});
|
|
118
|
+
describe('syncPackageAccess - cutover-safe auth modes', () => {
|
|
119
|
+
let originalFetch;
|
|
120
|
+
const snapshot = {
|
|
121
|
+
name: '@ist/free',
|
|
122
|
+
version: '1.0.0',
|
|
123
|
+
access: 'public',
|
|
124
|
+
install: {},
|
|
125
|
+
};
|
|
126
|
+
beforeEach(() => {
|
|
127
|
+
originalFetch = globalThis.fetch;
|
|
128
|
+
process.env.LICENSE_API_ADMIN_KEY = 'test-admin-key';
|
|
129
|
+
delete process.env.SNAPSHOT_ACCESS_AUTH_MODE;
|
|
130
|
+
vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
131
|
+
vi.spyOn(console, 'warn').mockImplementation(() => { });
|
|
132
|
+
vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
133
|
+
});
|
|
134
|
+
afterEach(() => {
|
|
135
|
+
globalThis.fetch = originalFetch;
|
|
136
|
+
delete process.env.LICENSE_API_ADMIN_KEY;
|
|
137
|
+
delete process.env.SNAPSHOT_ACCESS_AUTH_MODE;
|
|
138
|
+
vi.restoreAllMocks();
|
|
139
|
+
});
|
|
140
|
+
it("defaults to gitlab mode (Bearer, no admin key) — STAGE2 cutover", async () => {
|
|
141
|
+
const fetchMock = makeFetchMock();
|
|
142
|
+
globalThis.fetch = fetchMock;
|
|
143
|
+
// No authMode / no env → default is now 'gitlab'.
|
|
144
|
+
await syncPackageAccess(snapshot, {
|
|
145
|
+
includeTransitive: false,
|
|
146
|
+
gitlabToken: 'glpat-default',
|
|
147
|
+
});
|
|
148
|
+
const headers = upsertHeaders(fetchMock)[0];
|
|
149
|
+
expect(headers['Authorization']).toBe('Bearer glpat-default');
|
|
150
|
+
expect(headers['X-Admin-Api-Key']).toBeUndefined();
|
|
151
|
+
});
|
|
152
|
+
it("admin-key mode (explicit) sends legacy header only — transitional fallback", async () => {
|
|
153
|
+
const fetchMock = makeFetchMock();
|
|
154
|
+
globalThis.fetch = fetchMock;
|
|
155
|
+
await syncPackageAccess(snapshot, {
|
|
156
|
+
includeTransitive: false,
|
|
157
|
+
authMode: 'admin-key',
|
|
158
|
+
});
|
|
159
|
+
const headers = upsertHeaders(fetchMock)[0];
|
|
160
|
+
expect(headers['X-Admin-Api-Key']).toBe('test-admin-key');
|
|
161
|
+
expect(headers['Authorization']).toBeUndefined();
|
|
162
|
+
});
|
|
163
|
+
it("fails closed: default (gitlab) without a token throws before any write", async () => {
|
|
164
|
+
const fetchMock = makeFetchMock();
|
|
165
|
+
globalThis.fetch = fetchMock;
|
|
166
|
+
await expect(syncPackageAccess(snapshot, { includeTransitive: false })).rejects.toThrow(/requires a GitLab token/);
|
|
167
|
+
expect(upsertBodies(fetchMock)).toHaveLength(0);
|
|
168
|
+
});
|
|
169
|
+
it("gitlab mode sends GitLab token as Bearer and drops the admin key", async () => {
|
|
170
|
+
const fetchMock = makeFetchMock();
|
|
171
|
+
globalThis.fetch = fetchMock;
|
|
172
|
+
await syncPackageAccess(snapshot, {
|
|
173
|
+
includeTransitive: false,
|
|
174
|
+
authMode: 'gitlab',
|
|
175
|
+
gitlabToken: 'glpat-xyz',
|
|
176
|
+
});
|
|
177
|
+
const headers = upsertHeaders(fetchMock)[0];
|
|
178
|
+
expect(headers['Authorization']).toBe('Bearer glpat-xyz');
|
|
179
|
+
expect(headers['X-Admin-Api-Key']).toBeUndefined();
|
|
180
|
+
});
|
|
181
|
+
it("dual mode sends BOTH headers during the transition window", async () => {
|
|
182
|
+
const fetchMock = makeFetchMock();
|
|
183
|
+
globalThis.fetch = fetchMock;
|
|
184
|
+
await syncPackageAccess(snapshot, {
|
|
185
|
+
includeTransitive: false,
|
|
186
|
+
authMode: 'dual',
|
|
187
|
+
gitlabToken: 'glpat-xyz',
|
|
188
|
+
});
|
|
189
|
+
const headers = upsertHeaders(fetchMock)[0];
|
|
190
|
+
expect(headers['Authorization']).toBe('Bearer glpat-xyz');
|
|
191
|
+
expect(headers['X-Admin-Api-Key']).toBe('test-admin-key');
|
|
192
|
+
});
|
|
193
|
+
it("SNAPSHOT_ACCESS_AUTH_MODE env selects the mode when no explicit option", async () => {
|
|
194
|
+
process.env.SNAPSHOT_ACCESS_AUTH_MODE = 'gitlab';
|
|
195
|
+
const fetchMock = makeFetchMock();
|
|
196
|
+
globalThis.fetch = fetchMock;
|
|
197
|
+
await syncPackageAccess(snapshot, {
|
|
198
|
+
includeTransitive: false,
|
|
199
|
+
gitlabToken: 'glpat-env',
|
|
200
|
+
});
|
|
201
|
+
const headers = upsertHeaders(fetchMock)[0];
|
|
202
|
+
expect(headers['Authorization']).toBe('Bearer glpat-env');
|
|
203
|
+
});
|
|
204
|
+
it("fails closed: gitlab mode without a token throws before any write", async () => {
|
|
205
|
+
const fetchMock = makeFetchMock();
|
|
206
|
+
globalThis.fetch = fetchMock;
|
|
207
|
+
await expect(syncPackageAccess(snapshot, { includeTransitive: false, authMode: 'gitlab' })).rejects.toThrow(/requires a GitLab token/);
|
|
208
|
+
// No write should have happened.
|
|
209
|
+
expect(upsertBodies(fetchMock)).toHaveLength(0);
|
|
210
|
+
});
|
|
211
|
+
it("dry-run makes no network calls and needs no credentials", async () => {
|
|
212
|
+
delete process.env.LICENSE_API_ADMIN_KEY;
|
|
213
|
+
const fetchMock = makeFetchMock();
|
|
214
|
+
globalThis.fetch = fetchMock;
|
|
215
|
+
const result = await syncPackageAccess(snapshot, {
|
|
216
|
+
includeTransitive: false,
|
|
217
|
+
dryRun: true,
|
|
218
|
+
authMode: 'gitlab',
|
|
219
|
+
});
|
|
220
|
+
expect(upsertBodies(fetchMock)).toHaveLength(0);
|
|
221
|
+
expect(result.registered).toContain('@ist/free');
|
|
222
|
+
});
|
|
223
|
+
});
|
|
112
224
|
//# sourceMappingURL=access-sync.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access-sync.test.js","sourceRoot":"","sources":["../../src/lib/access-sync.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C;;;;;;GAMG;AAEH,MAAM,UAAU,GAAG,GAAG,eAAe,iCAAiC,CAAC;AAEvE,SAAS,aAAa;IACpB,OAAO,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACxB,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;KACvB,CAAC,CAA4B,CAAC;AACjC,CAAC;AAED,6EAA6E;AAC7E,SAAS,YAAY,CAAC,SAAmC;IACvD,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK;SACxB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC;SACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAc,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,QAAQ,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACrE,IAAI,aAA2B,CAAC;IAEhC,UAAU,CAAC,GAAG,EAAE;QACd,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,gBAAgB,CAAC;QACrD,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACtD,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,KAAK,GAAG,aAAa,CAAC;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;QACzC,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;QAClC,UAAU,CAAC,KAAK,GAAG,SAAS,CAAC;QAE7B,MAAM,QAAQ,GAAa;YACzB,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,eAAe;YACvB,OAAO,EAAE;gBACP,gBAAgB,EAAE;oBAChB,eAAe,EAAE,OAAO;iBACzB;aACF;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"access-sync.test.js","sourceRoot":"","sources":["../../src/lib/access-sync.test.ts"],"names":[],"mappings":"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"}
|