@adonis-agora/flags 0.0.0-stage → 0.1.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/CHANGELOG.md +12 -0
- package/LICENSE +21 -0
- package/README.md +15 -2
- package/dist/assets/spa/assets/index-DdmFo7xr.js +12 -0
- package/dist/assets/spa/assets/index-DdmFo7xr.js.map +1 -0
- package/dist/assets/spa/assets/index-DhkcP3Cw.css +2 -0
- package/dist/assets/spa/index.html +26 -0
- package/dist/commands/flags_list.d.ts +9 -0
- package/dist/commands/flags_list.d.ts.map +1 -0
- package/dist/commands/flags_list.js +51 -0
- package/dist/commands/flags_list.js.map +1 -0
- package/dist/commands/flags_ops.d.ts +60 -0
- package/dist/commands/flags_ops.d.ts.map +1 -0
- package/dist/commands/flags_ops.js +253 -0
- package/dist/commands/flags_ops.js.map +1 -0
- package/dist/commands/flags_refs.d.ts +15 -0
- package/dist/commands/flags_refs.d.ts.map +1 -0
- package/dist/commands/flags_refs.js +90 -0
- package/dist/commands/flags_refs.js.map +1 -0
- package/dist/commands/flags_set.d.ts +19 -0
- package/dist/commands/flags_set.d.ts.map +1 -0
- package/dist/commands/flags_set.js +97 -0
- package/dist/commands/flags_set.js.map +1 -0
- package/dist/commands/flags_types.d.ts +18 -0
- package/dist/commands/flags_types.d.ts.map +1 -0
- package/dist/commands/flags_types.js +94 -0
- package/dist/commands/flags_types.js.map +1 -0
- package/dist/commands/flags_work.d.ts +16 -0
- package/dist/commands/flags_work.d.ts.map +1 -0
- package/dist/commands/flags_work.js +71 -0
- package/dist/commands/flags_work.js.map +1 -0
- package/dist/commands/main.d.ts +15 -0
- package/dist/commands/main.d.ts.map +1 -0
- package/dist/commands/main.js +30 -0
- package/dist/commands/main.js.map +1 -0
- package/dist/commands/shared.d.ts +21 -0
- package/dist/commands/shared.d.ts.map +1 -0
- package/dist/commands/shared.js +70 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/configure.d.ts +11 -0
- package/dist/configure.d.ts.map +1 -0
- package/dist/configure.js +32 -0
- package/dist/configure.js.map +1 -0
- package/dist/providers/dashboard_provider.d.ts +65 -0
- package/dist/providers/dashboard_provider.d.ts.map +1 -0
- package/dist/providers/dashboard_provider.js +340 -0
- package/dist/providers/dashboard_provider.js.map +1 -0
- package/dist/providers/flags_provider.d.ts +30 -0
- package/dist/providers/flags_provider.d.ts.map +1 -0
- package/dist/providers/flags_provider.js +184 -0
- package/dist/providers/flags_provider.js.map +1 -0
- package/dist/services/main.d.ts +17 -0
- package/dist/services/main.d.ts.map +1 -0
- package/dist/services/main.js +20 -0
- package/dist/services/main.js.map +1 -0
- package/dist/src/admin.d.ts +189 -0
- package/dist/src/admin.d.ts.map +1 -0
- package/dist/src/admin.js +539 -0
- package/dist/src/admin.js.map +1 -0
- package/dist/src/analytics/backend.d.ts +18 -0
- package/dist/src/analytics/backend.d.ts.map +1 -0
- package/dist/src/analytics/backend.js +25 -0
- package/dist/src/analytics/backend.js.map +1 -0
- package/dist/src/analytics/clickhouse_backend.d.ts +16 -0
- package/dist/src/analytics/clickhouse_backend.d.ts.map +1 -0
- package/dist/src/analytics/clickhouse_backend.js +48 -0
- package/dist/src/analytics/clickhouse_backend.js.map +1 -0
- package/dist/src/analytics/duckdb.d.ts +39 -0
- package/dist/src/analytics/duckdb.d.ts.map +1 -0
- package/dist/src/analytics/duckdb.js +117 -0
- package/dist/src/analytics/duckdb.js.map +1 -0
- package/dist/src/analytics/lucid_backend.d.ts +16 -0
- package/dist/src/analytics/lucid_backend.d.ts.map +1 -0
- package/dist/src/analytics/lucid_backend.js +45 -0
- package/dist/src/analytics/lucid_backend.js.map +1 -0
- package/dist/src/analytics/metrics.d.ts +50 -0
- package/dist/src/analytics/metrics.d.ts.map +1 -0
- package/dist/src/analytics/metrics.js +42 -0
- package/dist/src/analytics/metrics.js.map +1 -0
- package/dist/src/analytics/results.d.ts +80 -0
- package/dist/src/analytics/results.d.ts.map +1 -0
- package/dist/src/analytics/results.js +143 -0
- package/dist/src/analytics/results.js.map +1 -0
- package/dist/src/dashboard/access_denied_page.d.ts +100 -0
- package/dist/src/dashboard/access_denied_page.d.ts.map +1 -0
- package/dist/src/dashboard/access_denied_page.js +262 -0
- package/dist/src/dashboard/access_denied_page.js.map +1 -0
- package/dist/src/dashboard/actor.d.ts +12 -0
- package/dist/src/dashboard/actor.d.ts.map +1 -0
- package/dist/src/dashboard/actor.js +33 -0
- package/dist/src/dashboard/actor.js.map +1 -0
- package/dist/src/dashboard/authorize_decision.d.ts +48 -0
- package/dist/src/dashboard/authorize_decision.d.ts.map +1 -0
- package/dist/src/dashboard/authorize_decision.js +44 -0
- package/dist/src/dashboard/authorize_decision.js.map +1 -0
- package/dist/src/dashboard/console_authorize.d.ts +77 -0
- package/dist/src/dashboard/console_authorize.d.ts.map +1 -0
- package/dist/src/dashboard/console_authorize.js +104 -0
- package/dist/src/dashboard/console_authorize.js.map +1 -0
- package/dist/src/dashboard/define_config.d.ts +71 -0
- package/dist/src/dashboard/define_config.d.ts.map +1 -0
- package/dist/src/dashboard/define_config.js +18 -0
- package/dist/src/dashboard/define_config.js.map +1 -0
- package/dist/src/dashboard/handlers.d.ts +172 -0
- package/dist/src/dashboard/handlers.d.ts.map +1 -0
- package/dist/src/dashboard/handlers.js +949 -0
- package/dist/src/dashboard/handlers.js.map +1 -0
- package/dist/src/dashboard/index.d.ts +15 -0
- package/dist/src/dashboard/index.d.ts.map +1 -0
- package/dist/src/dashboard/index.js +10 -0
- package/dist/src/dashboard/index.js.map +1 -0
- package/dist/src/dashboard/shape.d.ts +12 -0
- package/dist/src/dashboard/shape.d.ts.map +1 -0
- package/dist/src/dashboard/shape.js +232 -0
- package/dist/src/dashboard/shape.js.map +1 -0
- package/dist/src/dashboard/spa.d.ts +34 -0
- package/dist/src/dashboard/spa.d.ts.map +1 -0
- package/dist/src/dashboard/spa.js +50 -0
- package/dist/src/dashboard/spa.js.map +1 -0
- package/dist/src/declare.d.ts +85 -0
- package/dist/src/declare.d.ts.map +1 -0
- package/dist/src/declare.js +62 -0
- package/dist/src/declare.js.map +1 -0
- package/dist/src/define_config.d.ts +256 -0
- package/dist/src/define_config.d.ts.map +1 -0
- package/dist/src/define_config.js +90 -0
- package/dist/src/define_config.js.map +1 -0
- package/dist/src/durable.d.ts +29 -0
- package/dist/src/durable.d.ts.map +1 -0
- package/dist/src/durable.js +55 -0
- package/dist/src/durable.js.map +1 -0
- package/dist/src/enrichers.d.ts +51 -0
- package/dist/src/enrichers.d.ts.map +1 -0
- package/dist/src/enrichers.js +105 -0
- package/dist/src/enrichers.js.map +1 -0
- package/dist/src/events/buffer.d.ts +38 -0
- package/dist/src/events/buffer.d.ts.map +1 -0
- package/dist/src/events/buffer.js +86 -0
- package/dist/src/events/buffer.js.map +1 -0
- package/dist/src/events/event.d.ts +42 -0
- package/dist/src/events/event.d.ts.map +1 -0
- package/dist/src/events/event.js +82 -0
- package/dist/src/events/event.js.map +1 -0
- package/dist/src/http/browser.d.ts +33 -0
- package/dist/src/http/browser.d.ts.map +1 -0
- package/dist/src/http/browser.js +81 -0
- package/dist/src/http/browser.js.map +1 -0
- package/dist/src/http/browser_api.d.ts +48 -0
- package/dist/src/http/browser_api.d.ts.map +1 -0
- package/dist/src/http/browser_api.js +273 -0
- package/dist/src/http/browser_api.js.map +1 -0
- package/dist/src/http/browser_tokens.d.ts +27 -0
- package/dist/src/http/browser_tokens.d.ts.map +1 -0
- package/dist/src/http/browser_tokens.js +48 -0
- package/dist/src/http/browser_tokens.js.map +1 -0
- package/dist/src/http/control_plane.d.ts +58 -0
- package/dist/src/http/control_plane.d.ts.map +1 -0
- package/dist/src/http/control_plane.js +318 -0
- package/dist/src/http/control_plane.js.map +1 -0
- package/dist/src/http/csrf.d.ts +22 -0
- package/dist/src/http/csrf.d.ts.map +1 -0
- package/dist/src/http/csrf.js +24 -0
- package/dist/src/http/csrf.js.map +1 -0
- package/dist/src/http/edge_tag.d.ts +55 -0
- package/dist/src/http/edge_tag.d.ts.map +1 -0
- package/dist/src/http/edge_tag.js +45 -0
- package/dist/src/http/edge_tag.js.map +1 -0
- package/dist/src/http/flag_middleware.d.ts +27 -0
- package/dist/src/http/flag_middleware.d.ts.map +1 -0
- package/dist/src/http/flag_middleware.js +30 -0
- package/dist/src/http/flag_middleware.js.map +1 -0
- package/dist/src/http/flags_middleware.d.ts +20 -0
- package/dist/src/http/flags_middleware.d.ts.map +1 -0
- package/dist/src/http/flags_middleware.js +20 -0
- package/dist/src/http/flags_middleware.js.map +1 -0
- package/dist/src/http/subject_resolver.d.ts +45 -0
- package/dist/src/http/subject_resolver.d.ts.map +1 -0
- package/dist/src/http/subject_resolver.js +93 -0
- package/dist/src/http/subject_resolver.js.map +1 -0
- package/dist/src/identity.d.ts +82 -0
- package/dist/src/identity.d.ts.map +1 -0
- package/dist/src/identity.js +100 -0
- package/dist/src/identity.js.map +1 -0
- package/dist/src/index.d.ts +41 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +34 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/manager.d.ts +154 -0
- package/dist/src/manager.d.ts.map +1 -0
- package/dist/src/manager.js +333 -0
- package/dist/src/manager.js.map +1 -0
- package/dist/src/openfeature/provider.d.ts +36 -0
- package/dist/src/openfeature/provider.d.ts.map +1 -0
- package/dist/src/openfeature/provider.js +82 -0
- package/dist/src/openfeature/provider.js.map +1 -0
- package/dist/src/relay/relay.d.ts +36 -0
- package/dist/src/relay/relay.d.ts.map +1 -0
- package/dist/src/relay/relay.js +73 -0
- package/dist/src/relay/relay.js.map +1 -0
- package/dist/src/relay/results_cache.d.ts +20 -0
- package/dist/src/relay/results_cache.d.ts.map +1 -0
- package/dist/src/relay/results_cache.js +31 -0
- package/dist/src/relay/results_cache.js.map +1 -0
- package/dist/src/relay/worker.d.ts +66 -0
- package/dist/src/relay/worker.d.ts.map +1 -0
- package/dist/src/relay/worker.js +177 -0
- package/dist/src/relay/worker.js.map +1 -0
- package/dist/src/ruleset_source.d.ts +73 -0
- package/dist/src/ruleset_source.d.ts.map +1 -0
- package/dist/src/ruleset_source.js +128 -0
- package/dist/src/ruleset_source.js.map +1 -0
- package/dist/src/runtime.d.ts +70 -0
- package/dist/src/runtime.d.ts.map +1 -0
- package/dist/src/runtime.js +301 -0
- package/dist/src/runtime.js.map +1 -0
- package/dist/src/schema.d.ts +39 -0
- package/dist/src/schema.d.ts.map +1 -0
- package/dist/src/schema.js +311 -0
- package/dist/src/schema.js.map +1 -0
- package/dist/src/services/accessor.d.ts +5 -0
- package/dist/src/services/accessor.d.ts.map +1 -0
- package/dist/src/services/accessor.js +20 -0
- package/dist/src/services/accessor.js.map +1 -0
- package/dist/src/sinks/clickhouse.d.ts +41 -0
- package/dist/src/sinks/clickhouse.d.ts.map +1 -0
- package/dist/src/sinks/clickhouse.js +117 -0
- package/dist/src/sinks/clickhouse.js.map +1 -0
- package/dist/src/sinks/lucid_sink.d.ts +25 -0
- package/dist/src/sinks/lucid_sink.d.ts.map +1 -0
- package/dist/src/sinks/lucid_sink.js +87 -0
- package/dist/src/sinks/lucid_sink.js.map +1 -0
- package/dist/src/sinks/parquet_sink.d.ts +41 -0
- package/dist/src/sinks/parquet_sink.d.ts.map +1 -0
- package/dist/src/sinks/parquet_sink.js +140 -0
- package/dist/src/sinks/parquet_sink.js.map +1 -0
- package/dist/src/sinks/posthog_sink.d.ts +29 -0
- package/dist/src/sinks/posthog_sink.d.ts.map +1 -0
- package/dist/src/sinks/posthog_sink.js +65 -0
- package/dist/src/sinks/posthog_sink.js.map +1 -0
- package/dist/src/sinks/sink.d.ts +36 -0
- package/dist/src/sinks/sink.d.ts.map +1 -0
- package/dist/src/sinks/sink.js +36 -0
- package/dist/src/sinks/sink.js.map +1 -0
- package/dist/src/sql.d.ts +33 -0
- package/dist/src/sql.d.ts.map +1 -0
- package/dist/src/sql.js +66 -0
- package/dist/src/sql.js.map +1 -0
- package/dist/src/stores/lucid_store.d.ts +55 -0
- package/dist/src/stores/lucid_store.d.ts.map +1 -0
- package/dist/src/stores/lucid_store.js +412 -0
- package/dist/src/stores/lucid_store.js.map +1 -0
- package/dist/src/stores/memory_store.d.ts +38 -0
- package/dist/src/stores/memory_store.d.ts.map +1 -0
- package/dist/src/stores/memory_store.js +166 -0
- package/dist/src/stores/memory_store.js.map +1 -0
- package/dist/src/stores/store.d.ts +166 -0
- package/dist/src/stores/store.d.ts.map +1 -0
- package/dist/src/stores/store.js +67 -0
- package/dist/src/stores/store.js.map +1 -0
- package/dist/src/subject.d.ts +25 -0
- package/dist/src/subject.d.ts.map +1 -0
- package/dist/src/subject.js +30 -0
- package/dist/src/subject.js.map +1 -0
- package/dist/src/testing/index.d.ts +31 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +60 -0
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/topology/browser_token.d.ts +48 -0
- package/dist/src/topology/browser_token.d.ts.map +1 -0
- package/dist/src/topology/browser_token.js +128 -0
- package/dist/src/topology/browser_token.js.map +1 -0
- package/dist/src/topology/remote_source.d.ts +39 -0
- package/dist/src/topology/remote_source.d.ts.map +1 -0
- package/dist/src/topology/remote_source.js +184 -0
- package/dist/src/topology/remote_source.js.map +1 -0
- package/dist/src/topology/token.d.ts +36 -0
- package/dist/src/topology/token.d.ts.map +1 -0
- package/dist/src/topology/token.js +68 -0
- package/dist/src/topology/token.js.map +1 -0
- package/dist/src/topology/verify.d.ts +88 -0
- package/dist/src/topology/verify.d.ts.map +1 -0
- package/dist/src/topology/verify.js +128 -0
- package/dist/src/topology/verify.js.map +1 -0
- package/dist/src/transports/db_transport.d.ts +55 -0
- package/dist/src/transports/db_transport.d.ts.map +1 -0
- package/dist/src/transports/db_transport.js +202 -0
- package/dist/src/transports/db_transport.js.map +1 -0
- package/dist/src/transports/http_transport.d.ts +30 -0
- package/dist/src/transports/http_transport.d.ts.map +1 -0
- package/dist/src/transports/http_transport.js +51 -0
- package/dist/src/transports/http_transport.js.map +1 -0
- package/dist/src/transports/memory_transport.d.ts +29 -0
- package/dist/src/transports/memory_transport.d.ts.map +1 -0
- package/dist/src/transports/memory_transport.js +91 -0
- package/dist/src/transports/memory_transport.js.map +1 -0
- package/dist/src/transports/redis_transport.d.ts +50 -0
- package/dist/src/transports/redis_transport.d.ts.map +1 -0
- package/dist/src/transports/redis_transport.js +107 -0
- package/dist/src/transports/redis_transport.js.map +1 -0
- package/dist/src/transports/transport.d.ts +62 -0
- package/dist/src/transports/transport.d.ts.map +1 -0
- package/dist/src/transports/transport.js +2 -0
- package/dist/src/transports/transport.js.map +1 -0
- package/dist/src/types.d.ts +30 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/usage.d.ts +18 -0
- package/dist/src/usage.d.ts.map +1 -0
- package/dist/src/usage.js +52 -0
- package/dist/src/usage.js.map +1 -0
- package/dist/stubs/config/flags.stub +50 -0
- package/dist/stubs/config/flags_dashboard.stub +35 -0
- package/dist/stubs/database/migrations/create_flags_tables.stub +27 -0
- package/dist/stubs/main.d.ts +3 -0
- package/dist/stubs/main.d.ts.map +1 -0
- package/dist/stubs/main.js +9 -0
- package/dist/stubs/main.js.map +1 -0
- package/package.json +178 -3
- package/skills/flags-basics/SKILL.md +142 -0
- package/skills/flags-deployment/SKILL.md +125 -0
- package/skills/flags-experiments/SKILL.md +99 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { args, flags } from '@adonisjs/core/ace';
|
|
11
|
+
import { cliActor, FlagsCommand } from './shared.js';
|
|
12
|
+
/** Applies a `flags:set` value. Exported for tests. */
|
|
13
|
+
export function applySetValue(admin, key, value, actor, options) {
|
|
14
|
+
if (value === 'on')
|
|
15
|
+
return admin.turnOn(key, actor, options);
|
|
16
|
+
if (value === 'off')
|
|
17
|
+
return admin.turnOff(key, actor, options);
|
|
18
|
+
if (value === 'kill')
|
|
19
|
+
return admin.setEnabled(key, false, actor, options);
|
|
20
|
+
if (value === 'unkill')
|
|
21
|
+
return admin.setEnabled(key, true, actor, options);
|
|
22
|
+
const percent = /^(\d+(?:\.\d+)?)%$/.exec(value);
|
|
23
|
+
if (percent)
|
|
24
|
+
return admin.setRollout(key, Number(percent[1]), actor, options);
|
|
25
|
+
return setVariantOrValue(admin, key, value, actor, options);
|
|
26
|
+
}
|
|
27
|
+
/** A variant by name; otherwise a value of the flag's type (`25` for a number flag, JSON for json). */
|
|
28
|
+
async function setVariantOrValue(admin, key, value, actor, options) {
|
|
29
|
+
const definition = await admin.definition(key, options.environment);
|
|
30
|
+
if (Object.hasOwn(definition.variants, value))
|
|
31
|
+
return admin.setVariant(key, value, actor, options);
|
|
32
|
+
const type = admin.declarations[key]?.type ??
|
|
33
|
+
definition.declaration?.type ??
|
|
34
|
+
typeof Object.values(definition.variants)[0];
|
|
35
|
+
if (type === 'number') {
|
|
36
|
+
const number = Number(value);
|
|
37
|
+
if (value.trim() === '' || !Number.isFinite(number)) {
|
|
38
|
+
throw new Error(`"${value}" is not a number, and ${key} is a number flag`);
|
|
39
|
+
}
|
|
40
|
+
return admin.setValue(key, number, actor, options);
|
|
41
|
+
}
|
|
42
|
+
if (type === 'json' || type === 'object') {
|
|
43
|
+
let parsed;
|
|
44
|
+
try {
|
|
45
|
+
parsed = JSON.parse(value);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
throw new Error(`"${value}" is not valid JSON, and ${key} is a JSON flag`);
|
|
49
|
+
}
|
|
50
|
+
return admin.setValue(key, parsed, actor, options);
|
|
51
|
+
}
|
|
52
|
+
if (type === 'string' &&
|
|
53
|
+
!definition.declaration?.variants &&
|
|
54
|
+
!admin.declarations[key]?.variants) {
|
|
55
|
+
return admin.setValue(key, value, actor, options);
|
|
56
|
+
}
|
|
57
|
+
const known = Object.keys(definition.variants).join(', ');
|
|
58
|
+
throw new Error(`${key} has no variant "${value}" (variants: ${known})`);
|
|
59
|
+
}
|
|
60
|
+
export default class FlagsSet extends FlagsCommand {
|
|
61
|
+
static commandName = 'flags:set';
|
|
62
|
+
static description = 'Change what a flag serves: on | off | kill | unkill | <n>% (rollout) | <variant> | <value>';
|
|
63
|
+
async run() {
|
|
64
|
+
const runtime = await this.runtime();
|
|
65
|
+
const result = await applySetValue(runtime.admin, this.key, this.value, cliActor(this.as), {
|
|
66
|
+
...(this.env ? { environment: this.env } : {}),
|
|
67
|
+
...(this.note ? { note: this.note } : {}),
|
|
68
|
+
});
|
|
69
|
+
if (result.status === 'applied')
|
|
70
|
+
this.logger.success(`${this.key} → ${this.value} (ruleset version ${result.version})`);
|
|
71
|
+
else
|
|
72
|
+
this.logger.warning(`approval required: change request ${result.request.id} is pending`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
__decorate([
|
|
76
|
+
args.string({ description: 'Flag key' }),
|
|
77
|
+
__metadata("design:type", String)
|
|
78
|
+
], FlagsSet.prototype, "key", void 0);
|
|
79
|
+
__decorate([
|
|
80
|
+
args.string({
|
|
81
|
+
description: 'on, off, kill, unkill, 25%, a variant name, or a value (number/string/JSON flags)',
|
|
82
|
+
}),
|
|
83
|
+
__metadata("design:type", String)
|
|
84
|
+
], FlagsSet.prototype, "value", void 0);
|
|
85
|
+
__decorate([
|
|
86
|
+
flags.string({ description: 'Environment (default: the configured one)' }),
|
|
87
|
+
__metadata("design:type", String)
|
|
88
|
+
], FlagsSet.prototype, "env", void 0);
|
|
89
|
+
__decorate([
|
|
90
|
+
flags.string({ description: 'Why (kept on the change request / audit)' }),
|
|
91
|
+
__metadata("design:type", String)
|
|
92
|
+
], FlagsSet.prototype, "note", void 0);
|
|
93
|
+
__decorate([
|
|
94
|
+
flags.string({ description: 'Act as this actor id instead of cli:<user>' }),
|
|
95
|
+
__metadata("design:type", String)
|
|
96
|
+
], FlagsSet.prototype, "as", void 0);
|
|
97
|
+
//# sourceMappingURL=flags_set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags_set.js","sourceRoot":"","sources":["../../commands/flags_set.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { FlagDeclaration } from '../src/declare.js';
|
|
2
|
+
import { FlagsCommand } from './shared.js';
|
|
3
|
+
/**
|
|
4
|
+
* The `.d.ts` for console-created flags. Code-declared flags are left to `InferFlags` in
|
|
5
|
+
* `config/flags.ts` (their exact JSON types come from code). Exported for tests.
|
|
6
|
+
*/
|
|
7
|
+
export declare function renderFlagTypes(consoleFlags: Record<string, FlagDeclaration>, options: {
|
|
8
|
+
strict: boolean;
|
|
9
|
+
}): string;
|
|
10
|
+
export default class FlagsTypes extends FlagsCommand {
|
|
11
|
+
static commandName: string;
|
|
12
|
+
static description: string;
|
|
13
|
+
env?: string;
|
|
14
|
+
out?: string;
|
|
15
|
+
strict: boolean;
|
|
16
|
+
run(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=flags_types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags_types.d.ts","sourceRoot":"","sources":["../../commands/flags_types.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAc3C;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EAC7C,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GAC3B,MAAM,CA6BR;AAED,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,YAAY;IAClD,OAAgB,WAAW,SAAiB;IAC5C,OAAgB,WAAW,SAAoE;IAGvF,GAAG,CAAC,EAAE,MAAM,CAAC;IAGb,GAAG,CAAC,EAAE,MAAM,CAAC;IAMb,MAAM,EAAE,OAAO,CAAC;IAET,GAAG,kBAgBjB;CACF"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
11
|
+
import { dirname, isAbsolute, join } from 'node:path';
|
|
12
|
+
import { flags } from '@adonisjs/core/ace';
|
|
13
|
+
import { FlagsCommand } from './shared.js';
|
|
14
|
+
/** The TypeScript type a declaration's values have. */
|
|
15
|
+
function typeOf(declaration) {
|
|
16
|
+
if (declaration.type === 'boolean')
|
|
17
|
+
return 'boolean';
|
|
18
|
+
if (declaration.type === 'number')
|
|
19
|
+
return 'number';
|
|
20
|
+
if (declaration.type === 'string') {
|
|
21
|
+
return declaration.variants?.length
|
|
22
|
+
? declaration.variants.map((v) => JSON.stringify(v)).join(' | ')
|
|
23
|
+
: 'string';
|
|
24
|
+
}
|
|
25
|
+
return 'JsonValue';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The `.d.ts` for console-created flags. Code-declared flags are left to `InferFlags` in
|
|
29
|
+
* `config/flags.ts` (their exact JSON types come from code). Exported for tests.
|
|
30
|
+
*/
|
|
31
|
+
export function renderFlagTypes(consoleFlags, options) {
|
|
32
|
+
const entries = Object.keys(consoleFlags)
|
|
33
|
+
.sort()
|
|
34
|
+
.map((key) => {
|
|
35
|
+
const declaration = consoleFlags[key];
|
|
36
|
+
const doc = declaration.description
|
|
37
|
+
? ` /** ${declaration.description.replaceAll('*/', '* /')} */\n`
|
|
38
|
+
: '';
|
|
39
|
+
return `${doc} ${JSON.stringify(key)}: ${typeOf(declaration)};`;
|
|
40
|
+
})
|
|
41
|
+
.join('\n');
|
|
42
|
+
return `// Generated by \`node ace flags:types\` from the flags created in the console. Do not edit:
|
|
43
|
+
// regenerate after creating or changing a flag there.
|
|
44
|
+
import type { JsonValue } from '@adonis-agora/flags';
|
|
45
|
+
|
|
46
|
+
declare module '@adonis-agora/flags/types' {
|
|
47
|
+
interface FlagsList {
|
|
48
|
+
${entries}
|
|
49
|
+
}${options.strict
|
|
50
|
+
? `
|
|
51
|
+
/** Every flag is now typed: unknown keys are compile errors. */
|
|
52
|
+
interface FlagsSettings {
|
|
53
|
+
strictKeys: true;
|
|
54
|
+
}`
|
|
55
|
+
: ''}
|
|
56
|
+
}
|
|
57
|
+
`;
|
|
58
|
+
}
|
|
59
|
+
export default class FlagsTypes extends FlagsCommand {
|
|
60
|
+
static commandName = 'flags:types';
|
|
61
|
+
static description = 'Generate TypeScript types for the flags created in the console';
|
|
62
|
+
async run() {
|
|
63
|
+
const runtime = await this.runtime();
|
|
64
|
+
const environment = this.env ?? runtime.manager.environment;
|
|
65
|
+
const ruleset = await runtime.store.readRuleset(environment);
|
|
66
|
+
const code = runtime.manager.declarations;
|
|
67
|
+
const consoleFlags = {};
|
|
68
|
+
for (const [key, definition] of Object.entries(ruleset.flags)) {
|
|
69
|
+
if (definition.declaration && !code[key])
|
|
70
|
+
consoleFlags[key] = { ...definition.declaration };
|
|
71
|
+
}
|
|
72
|
+
const target = this.out ?? 'types/flags.d.ts';
|
|
73
|
+
const path = isAbsolute(target) ? target : join(this.app.appRoot.pathname, target);
|
|
74
|
+
await mkdir(dirname(path), { recursive: true });
|
|
75
|
+
await writeFile(path, renderFlagTypes(consoleFlags, { strict: this.strict }));
|
|
76
|
+
this.logger.success(`${Object.keys(consoleFlags).length} console flag(s) typed in ${target}${this.strict ? ' (strict keys)' : ''}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
__decorate([
|
|
80
|
+
flags.string({ description: 'Environment to read (default: the configured one)' }),
|
|
81
|
+
__metadata("design:type", String)
|
|
82
|
+
], FlagsTypes.prototype, "env", void 0);
|
|
83
|
+
__decorate([
|
|
84
|
+
flags.string({ description: 'Output file (default: types/flags.d.ts)' }),
|
|
85
|
+
__metadata("design:type", String)
|
|
86
|
+
], FlagsTypes.prototype, "out", void 0);
|
|
87
|
+
__decorate([
|
|
88
|
+
flags.boolean({
|
|
89
|
+
description: 'Make unknown flag keys a compile error (default: true)',
|
|
90
|
+
default: true,
|
|
91
|
+
}),
|
|
92
|
+
__metadata("design:type", Boolean)
|
|
93
|
+
], FlagsTypes.prototype, "strict", void 0);
|
|
94
|
+
//# sourceMappingURL=flags_types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags_types.js","sourceRoot":"","sources":["../../commands/flags_types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CommandOptions } from '@adonisjs/core/types/ace';
|
|
2
|
+
import { FlagsCommand } from './shared.js';
|
|
3
|
+
/**
|
|
4
|
+
* The background loop outside web processes: relay events to sinks, run scheduled changes,
|
|
5
|
+
* recompute experiment results, maintain the event log. `--once` runs one pass and exits (cron
|
|
6
|
+
* jobs); without it the command stays up until SIGTERM.
|
|
7
|
+
*/
|
|
8
|
+
export default class FlagsWork extends FlagsCommand {
|
|
9
|
+
static commandName: string;
|
|
10
|
+
static description: string;
|
|
11
|
+
static options: CommandOptions;
|
|
12
|
+
once?: boolean;
|
|
13
|
+
sink?: string;
|
|
14
|
+
run(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=flags_work.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags_work.d.ts","sourceRoot":"","sources":["../../commands/flags_work.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,YAAY;IACjD,OAAgB,WAAW,SAAgB;IAC3C,OAAgB,WAAW,SACgD;IAC3E,OAAgB,OAAO,EAAE,cAAc,CAAwC;IAGvE,IAAI,CAAC,EAAE,OAAO,CAAC;IAGf,IAAI,CAAC,EAAE,MAAM,CAAC;IAEP,GAAG,kBA2CjB;CACF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { flags } from '@adonisjs/core/ace';
|
|
11
|
+
import { FlagsCommand } from './shared.js';
|
|
12
|
+
/**
|
|
13
|
+
* The background loop outside web processes: relay events to sinks, run scheduled changes,
|
|
14
|
+
* recompute experiment results, maintain the event log. `--once` runs one pass and exits (cron
|
|
15
|
+
* jobs); without it the command stays up until SIGTERM.
|
|
16
|
+
*/
|
|
17
|
+
export default class FlagsWork extends FlagsCommand {
|
|
18
|
+
static commandName = 'flags:work';
|
|
19
|
+
static description = 'Run the flags background work (relay, schedules, results, maintenance)';
|
|
20
|
+
static options = { startApp: true, staysAlive: true };
|
|
21
|
+
async run() {
|
|
22
|
+
const runtime = await this.runtime();
|
|
23
|
+
const worker = runtime.worker;
|
|
24
|
+
if (this.sink) {
|
|
25
|
+
if (!runtime.sinks.has(this.sink)) {
|
|
26
|
+
this.logger.error(`unknown sink "${this.sink}" (configured: ${[...runtime.sinks.keys()].join(', ') || 'none'})`);
|
|
27
|
+
this.exitCode = 1;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
let stopping = false;
|
|
31
|
+
const stop = () => {
|
|
32
|
+
stopping = true;
|
|
33
|
+
};
|
|
34
|
+
process.once('SIGTERM', stop);
|
|
35
|
+
process.once('SIGINT', stop);
|
|
36
|
+
do {
|
|
37
|
+
const result = await worker.relaySink(this.sink);
|
|
38
|
+
if (result)
|
|
39
|
+
this.logger.info(`${this.sink}: delivered ${result.delivered}${result.busy ? ' (leased elsewhere)' : ''}`);
|
|
40
|
+
if (this.once)
|
|
41
|
+
break;
|
|
42
|
+
await new Promise((resolve) => setTimeout(resolve, 5000));
|
|
43
|
+
} while (!stopping);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (this.once) {
|
|
47
|
+
await worker.runAll();
|
|
48
|
+
this.logger.success('flags: one pass done');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
this.logger.info('flags: worker running (Ctrl+C to stop)');
|
|
52
|
+
worker.start();
|
|
53
|
+
await new Promise((resolve) => {
|
|
54
|
+
const stop = async () => {
|
|
55
|
+
await worker.stop();
|
|
56
|
+
resolve();
|
|
57
|
+
};
|
|
58
|
+
process.once('SIGTERM', stop);
|
|
59
|
+
process.once('SIGINT', stop);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
__decorate([
|
|
64
|
+
flags.boolean({ description: 'Run one pass and exit' }),
|
|
65
|
+
__metadata("design:type", Boolean)
|
|
66
|
+
], FlagsWork.prototype, "once", void 0);
|
|
67
|
+
__decorate([
|
|
68
|
+
flags.string({ description: 'Only relay to this sink' }),
|
|
69
|
+
__metadata("design:type", String)
|
|
70
|
+
], FlagsWork.prototype, "sink", void 0);
|
|
71
|
+
//# sourceMappingURL=flags_work.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags_work.js","sourceRoot":"","sources":["../../commands/flags_work.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ListLoader } from '@adonisjs/core/ace';
|
|
2
|
+
import FlagsList from './flags_list.js';
|
|
3
|
+
import { FlagsExport, FlagsForget, FlagsImport, FlagsPromote, FlagsReplay, FlagsRequests, FlagsResults, FlagsStale } from './flags_ops.js';
|
|
4
|
+
import FlagsRefs from './flags_refs.js';
|
|
5
|
+
import FlagsSet from './flags_set.js';
|
|
6
|
+
import FlagsWork from './flags_work.js';
|
|
7
|
+
/**
|
|
8
|
+
* The commands of `@adonis-agora/flags`, registered by `configure` with
|
|
9
|
+
* `rcFile.addCommand('@adonis-agora/flags/commands')`.
|
|
10
|
+
*/
|
|
11
|
+
declare const loader: ListLoader<typeof FlagsList | typeof FlagsExport | typeof FlagsImport | typeof FlagsPromote | typeof FlagsStale | typeof FlagsResults | typeof FlagsForget | typeof FlagsReplay | typeof FlagsRequests | typeof FlagsRefs | typeof FlagsSet | typeof FlagsWork>;
|
|
12
|
+
export declare const getMetaData: () => Promise<import("@adonisjs/core/types/ace").CommandMetaData[]>;
|
|
13
|
+
export declare const getCommand: (metaData: import("@adonisjs/core/types/ace").CommandMetaData) => Promise<typeof FlagsList | typeof FlagsExport | typeof FlagsImport | typeof FlagsPromote | typeof FlagsStale | typeof FlagsResults | typeof FlagsForget | typeof FlagsReplay | typeof FlagsRequests | typeof FlagsRefs | typeof FlagsSet | typeof FlagsWork | null>;
|
|
14
|
+
export default loader;
|
|
15
|
+
//# sourceMappingURL=main.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../commands/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,EACL,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,EACX,aAAa,EACb,YAAY,EACZ,UAAU,EACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,SAAS,MAAM,iBAAiB,CAAC;AAExC;;;GAGG;AACH,QAAA,MAAM,MAAM,iQAcV,CAAC;AAEH,eAAO,MAAM,WAAW,qEAAkC,CAAC;AAC3D,eAAO,MAAM,UAAU,uUAAiC,CAAC;eAE1C,MAAM"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ListLoader } from '@adonisjs/core/ace';
|
|
2
|
+
import FlagsList from './flags_list.js';
|
|
3
|
+
import { FlagsExport, FlagsForget, FlagsImport, FlagsPromote, FlagsReplay, FlagsRequests, FlagsResults, FlagsStale, } from './flags_ops.js';
|
|
4
|
+
import FlagsRefs from './flags_refs.js';
|
|
5
|
+
import FlagsSet from './flags_set.js';
|
|
6
|
+
import FlagsTypes from './flags_types.js';
|
|
7
|
+
import FlagsWork from './flags_work.js';
|
|
8
|
+
/**
|
|
9
|
+
* The commands of `@adonis-agora/flags`, registered by `configure` with
|
|
10
|
+
* `rcFile.addCommand('@adonis-agora/flags/commands')`.
|
|
11
|
+
*/
|
|
12
|
+
const loader = new ListLoader([
|
|
13
|
+
FlagsList,
|
|
14
|
+
FlagsSet,
|
|
15
|
+
FlagsWork,
|
|
16
|
+
FlagsExport,
|
|
17
|
+
FlagsImport,
|
|
18
|
+
FlagsPromote,
|
|
19
|
+
FlagsStale,
|
|
20
|
+
FlagsResults,
|
|
21
|
+
FlagsRefs,
|
|
22
|
+
FlagsForget,
|
|
23
|
+
FlagsReplay,
|
|
24
|
+
FlagsRequests,
|
|
25
|
+
FlagsTypes,
|
|
26
|
+
]);
|
|
27
|
+
export const getMetaData = loader.getMetaData.bind(loader);
|
|
28
|
+
export const getCommand = loader.getCommand.bind(loader);
|
|
29
|
+
export default loader;
|
|
30
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../commands/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,EACL,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,EACX,aAAa,EACb,YAAY,EACZ,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,SAAS,MAAM,iBAAiB,CAAC;AAExC;;;GAGG;AACH,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC;IAC5B,SAAS;IACT,QAAQ;IACR,SAAS;IACT,WAAW;IACX,WAAW;IACX,YAAY;IACZ,UAAU;IACV,YAAY;IACZ,SAAS;IACT,WAAW;IACX,WAAW;IACX,aAAa;IACb,UAAU;CACX,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC3D,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAEzD,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { FlagDefinition } from '@adonis-agora/flags-core';
|
|
2
|
+
import { BaseCommand } from '@adonisjs/core/ace';
|
|
3
|
+
import type { CommandOptions } from '@adonisjs/core/types/ace';
|
|
4
|
+
import type { FlagsRuntime } from '../src/runtime.js';
|
|
5
|
+
import type { Actor } from '../src/stores/store.js';
|
|
6
|
+
/** Who a command acts as: `cli:<os user>`, unless `--as` says otherwise. */
|
|
7
|
+
export declare function cliActor(as?: string): Actor;
|
|
8
|
+
/** One line on what a flag serves. */
|
|
9
|
+
export declare function describeServing(definition: FlagDefinition | undefined): string;
|
|
10
|
+
/** Base for every flags command: boots the app and hands the runtime over. */
|
|
11
|
+
export declare abstract class FlagsCommand extends BaseCommand {
|
|
12
|
+
static options: CommandOptions;
|
|
13
|
+
/**
|
|
14
|
+
* A refused change (unknown flag, invalid value, not allowed) is a message, not a stack trace.
|
|
15
|
+
* `@adonisjs/core` hands a command's error to this hook before printing it; returning `true`
|
|
16
|
+
* marks it handled. Programming errors keep their stack.
|
|
17
|
+
*/
|
|
18
|
+
completed(): Promise<boolean>;
|
|
19
|
+
protected runtime(): Promise<FlagsRuntime>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../commands/shared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAEpD,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,KAAK,CAS3C;AAED,sCAAsC;AACtC,wBAAgB,eAAe,CAAC,UAAU,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,CAoB9E;AAED,8EAA8E;AAC9E,8BAAsB,YAAa,SAAQ,WAAW;IACpD,OAAgB,OAAO,EAAE,cAAc,CAAsB;IAE7D;;;;OAIG;IACY,SAAS,qBAavB;IAED,UAAgB,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,CAM/C;CACF"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { userInfo } from 'node:os';
|
|
2
|
+
import { BaseCommand } from '@adonisjs/core/ace';
|
|
3
|
+
/** Who a command acts as: `cli:<os user>`, unless `--as` says otherwise. */
|
|
4
|
+
export function cliActor(as) {
|
|
5
|
+
if (as)
|
|
6
|
+
return { id: as };
|
|
7
|
+
let name = 'unknown';
|
|
8
|
+
try {
|
|
9
|
+
name = userInfo().username;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
// containers without a passwd entry
|
|
13
|
+
}
|
|
14
|
+
return { id: `cli:${name}` };
|
|
15
|
+
}
|
|
16
|
+
/** One line on what a flag serves. */
|
|
17
|
+
export function describeServing(definition) {
|
|
18
|
+
if (!definition)
|
|
19
|
+
return 'not configured (code default)';
|
|
20
|
+
if (!definition.enabled)
|
|
21
|
+
return `killed → ${definition.offVariant}`;
|
|
22
|
+
const parts = [];
|
|
23
|
+
const fallthrough = definition.fallthrough;
|
|
24
|
+
if ('variant' in fallthrough)
|
|
25
|
+
parts.push(`serves ${fallthrough.variant}`);
|
|
26
|
+
else {
|
|
27
|
+
const total = fallthrough.split.reduce((sum, arm) => sum + Math.max(0, arm.weight), 0) || 1;
|
|
28
|
+
parts.push(fallthrough.split
|
|
29
|
+
.filter((arm) => arm.weight > 0)
|
|
30
|
+
.map((arm) => `${arm.variant} ${Math.round((arm.weight / total) * 1000) / 10}%`)
|
|
31
|
+
.join(' / '));
|
|
32
|
+
}
|
|
33
|
+
if (definition.rules?.length)
|
|
34
|
+
parts.push(`${definition.rules.length} rule(s)`);
|
|
35
|
+
const overrides = Object.keys(definition.overrides ?? {}).length;
|
|
36
|
+
if (overrides)
|
|
37
|
+
parts.push(`${overrides} override(s)`);
|
|
38
|
+
if (definition.experiment)
|
|
39
|
+
parts.push('experiment');
|
|
40
|
+
return parts.join(', ');
|
|
41
|
+
}
|
|
42
|
+
/** Base for every flags command: boots the app and hands the runtime over. */
|
|
43
|
+
export class FlagsCommand extends BaseCommand {
|
|
44
|
+
static options = { startApp: true };
|
|
45
|
+
/**
|
|
46
|
+
* A refused change (unknown flag, invalid value, not allowed) is a message, not a stack trace.
|
|
47
|
+
* `@adonisjs/core` hands a command's error to this hook before printing it; returning `true`
|
|
48
|
+
* marks it handled. Programming errors keep their stack.
|
|
49
|
+
*/
|
|
50
|
+
async completed() {
|
|
51
|
+
const error = this.error;
|
|
52
|
+
if (error instanceof Error &&
|
|
53
|
+
!(error instanceof TypeError) &&
|
|
54
|
+
!(error instanceof ReferenceError) &&
|
|
55
|
+
!(error instanceof SyntaxError)) {
|
|
56
|
+
this.logger.error(error.message);
|
|
57
|
+
this.exitCode = 1;
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
async runtime() {
|
|
63
|
+
const runtime = (await this.app.container.make('flags.runtime'));
|
|
64
|
+
if (runtime.topology === 'tenant') {
|
|
65
|
+
throw new Error('this app is a tenant: run flags commands on the control-plane');
|
|
66
|
+
}
|
|
67
|
+
return runtime;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../commands/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type Configure from '@adonisjs/core/commands/configure';
|
|
2
|
+
/**
|
|
3
|
+
* `node ace configure @adonis-agora/flags`:
|
|
4
|
+
*
|
|
5
|
+
* 1. registers the providers (flags and the console) and the commands in `adonisrc.ts`;
|
|
6
|
+
* 2. registers `ctx.flags` (router middleware) and the `flag` route guard (named middleware);
|
|
7
|
+
* 3. publishes `config/flags.ts`, `config/flags_dashboard.ts` (the console) and the optional migration;
|
|
8
|
+
* 4. adds `FLAGS_ENVIRONMENT` to the env validations.
|
|
9
|
+
*/
|
|
10
|
+
export declare function configure(command: Configure): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=configure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../configure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,mCAAmC,CAAC;AAG/D;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,SAAS,iBA4BjD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { stubsRoot } from './stubs/main.js';
|
|
2
|
+
/**
|
|
3
|
+
* `node ace configure @adonis-agora/flags`:
|
|
4
|
+
*
|
|
5
|
+
* 1. registers the providers (flags and the console) and the commands in `adonisrc.ts`;
|
|
6
|
+
* 2. registers `ctx.flags` (router middleware) and the `flag` route guard (named middleware);
|
|
7
|
+
* 3. publishes `config/flags.ts`, `config/flags_dashboard.ts` (the console) and the optional migration;
|
|
8
|
+
* 4. adds `FLAGS_ENVIRONMENT` to the env validations.
|
|
9
|
+
*/
|
|
10
|
+
export async function configure(command) {
|
|
11
|
+
const codemods = await command.createCodemods();
|
|
12
|
+
// biome-ignore lint/suspicious/noExplicitAny: `updateRcFile` types its callback loosely.
|
|
13
|
+
await codemods.updateRcFile((rcFile) => {
|
|
14
|
+
rcFile.addProvider('@adonis-agora/flags/flags_provider');
|
|
15
|
+
rcFile.addProvider('@adonis-agora/flags/dashboard_provider');
|
|
16
|
+
rcFile.addCommand('@adonis-agora/flags/commands');
|
|
17
|
+
});
|
|
18
|
+
await codemods.registerMiddleware('router', [{ path: '@adonis-agora/flags/flags_middleware' }]);
|
|
19
|
+
await codemods.registerMiddleware('named', [
|
|
20
|
+
{ name: 'flag', path: '@adonis-agora/flags/flag_middleware' },
|
|
21
|
+
]);
|
|
22
|
+
const stubs = stubsRoot();
|
|
23
|
+
await codemods.makeUsingStub(stubs, 'config/flags.stub', {});
|
|
24
|
+
await codemods.makeUsingStub(stubs, 'config/flags_dashboard.stub', {});
|
|
25
|
+
await codemods.makeUsingStub(stubs, 'database/migrations/create_flags_tables.stub', {});
|
|
26
|
+
await codemods.defineEnvValidations({
|
|
27
|
+
leadingComment: 'Feature flags',
|
|
28
|
+
variables: { FLAGS_ENVIRONMENT: 'Env.schema.string.optional()' },
|
|
29
|
+
});
|
|
30
|
+
command.logger.info('With @adonisjs/shield, a central flags server or frontends reading flags (`browser`): exempt the token-authenticated flags API from CSRF in config/shield.ts — `exceptRoutes: (ctx) => flagsCsrfExceptions(ctx.request.url())`, imported from @adonis-agora/flags.');
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=configure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../configure.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAkB;IAChD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC;IAEhD,yFAAyF;IACzF,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC,MAAW,EAAE,EAAE;QAC1C,MAAM,CAAC,WAAW,CAAC,oCAAoC,CAAC,CAAC;QACzD,MAAM,CAAC,WAAW,CAAC,wCAAwC,CAAC,CAAC;QAC7D,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,sCAAsC,EAAE,CAAC,CAAC,CAAC;IAChG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,OAAO,EAAE;QACzC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qCAAqC,EAAE;KAC9D,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,MAAM,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,6BAA6B,EAAE,EAAE,CAAC,CAAC;IACvE,MAAM,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,8CAA8C,EAAE,EAAE,CAAC,CAAC;IAExF,MAAM,QAAQ,CAAC,oBAAoB,CAAC;QAClC,cAAc,EAAE,eAAe;QAC/B,SAAS,EAAE,EAAE,iBAAiB,EAAE,8BAA8B,EAAE;KACjE,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,CAAC,IAAI,CACjB,oQAAoQ,CACrQ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { ApplicationService } from '@adonisjs/core/types';
|
|
2
|
+
/** Logged once at boot when `authorize` is omitted. Same wording in every Agora console. */
|
|
3
|
+
export declare const NO_AUTHORIZE_WARNING = "[@adonis-agora/flags] console has no `authorize` configured: it is open outside production and denies every request in production. Set `authorize` in config/flags_dashboard.ts.";
|
|
4
|
+
/** Logged at boot on a tenant, which has nothing to edit locally. */
|
|
5
|
+
export declare const TENANT_WARNING = "[@adonis-agora/flags] this app is a flags tenant: its flags are edited on the control-plane, so the console is not mounted here. Remove the dashboard provider or open the control-plane console.";
|
|
6
|
+
/**
|
|
7
|
+
* Mounts the flags console into an AdonisJS app: the `@adonis-agora/flags-dashboard` React SPA plus
|
|
8
|
+
* a JSON API over the booted flags runtime (`getRuntime()`), under a configurable path (default
|
|
9
|
+
* `/flags`).
|
|
10
|
+
*
|
|
11
|
+
* Every write goes through `FlagsAdmin`, so the console gets the validation, `authorize` hook,
|
|
12
|
+
* two-person approvals and audit trail the commands get. Writes are `POST`/`PUT`/`DELETE` only —
|
|
13
|
+
* never a `GET` a prefetcher could follow — and sit behind the same {@link enforce} guard as every
|
|
14
|
+
* read. CSRF is the host app's: `@adonisjs/shield` guards these routes like any other
|
|
15
|
+
* state-changing route of the app, and the SPA echoes its `XSRF-TOKEN` cookie in `x-xsrf-token`.
|
|
16
|
+
*
|
|
17
|
+
* Routes (relative to the configured `path`):
|
|
18
|
+
* - `GET /`, `/assets/:file` → the SPA
|
|
19
|
+
* - `GET /api/meta` → environments, approvals, the acting user
|
|
20
|
+
* - `GET /api/flags`, `/api/flags/:key` → list / one flag (definition, audit, schedules)
|
|
21
|
+
* - `PUT /api/flags/:key` `DELETE /api/flags/:key` → save / remove a definition
|
|
22
|
+
* - `POST /api/flags/:key/{enabled,rollout,variant,overrides,schedules}`
|
|
23
|
+
* - `POST /api/preview`, `/api/evaluate` → validate a draft / test a context
|
|
24
|
+
* - `GET /api/segments` `PUT|DELETE /api/segments/:key`
|
|
25
|
+
* - `GET /api/layers` `PUT|DELETE /api/layers/:key` `PUT /api/holdout`
|
|
26
|
+
* - `GET /api/experiments`, `/api/experiments/:key` `POST /api/experiments/:key/recompute`
|
|
27
|
+
* - `GET /api/change-requests` `POST /api/change-requests/:id/{approve,reject,cancel}`
|
|
28
|
+
* - `GET /api/audit`, `/api/schedules` `DELETE /api/schedules/:id`
|
|
29
|
+
* - `GET /api/export` `POST /api/import`, `/api/promote`
|
|
30
|
+
* - `GET /api/stale`, `/api/ops`
|
|
31
|
+
*
|
|
32
|
+
* On a `tenant` (no store, no admin) nothing is registered and a warning is logged.
|
|
33
|
+
*/
|
|
34
|
+
export default class FlagsDashboardProvider {
|
|
35
|
+
protected app: ApplicationService;
|
|
36
|
+
constructor(app: ApplicationService);
|
|
37
|
+
private warnedOnAuthorizeThrow;
|
|
38
|
+
private authorizeGuard;
|
|
39
|
+
private identity;
|
|
40
|
+
boot(): Promise<void>;
|
|
41
|
+
private registerRoutes;
|
|
42
|
+
/**
|
|
43
|
+
* Who is acting: the configured `actor`, else the authkit identity (its `sub` and name), else
|
|
44
|
+
* `ctx.auth.user`, else the anonymous `'dashboard'` (refused where approvals are on).
|
|
45
|
+
*/
|
|
46
|
+
private actorOf;
|
|
47
|
+
/** Mount the React SPA at `config.path` plus its hashed asset bundle. */
|
|
48
|
+
private registerSpaRoutes;
|
|
49
|
+
private warn;
|
|
50
|
+
/**
|
|
51
|
+
* The `authorize` option turned into one guard. Omitted: open outside production, every request
|
|
52
|
+
* refused (`403`) in production; either way it says so once at boot.
|
|
53
|
+
*/
|
|
54
|
+
private resolveGuard;
|
|
55
|
+
private warnAuthorizeThrow;
|
|
56
|
+
/**
|
|
57
|
+
* Run the `authorize` gate. A denial answers `401`/`403` — the access-denied PAGE for a page
|
|
58
|
+
* navigation, `{ error }` JSON for an API call; `{ redirectTo }` is a `302` for a page and
|
|
59
|
+
* `401 { error, redirectTo }` for the API. A hook that already answered keeps its answer.
|
|
60
|
+
*/
|
|
61
|
+
private enforce;
|
|
62
|
+
/** Answer a refused PAGE navigation with HTML: the built-in page or the host's own. */
|
|
63
|
+
private denyPage;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=dashboard_provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard_provider.d.ts","sourceRoot":"","sources":["../../providers/dashboard_provider.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAqB,MAAM,sBAAsB,CAAC;AA6ElF,4FAA4F;AAC5F,eAAO,MAAM,oBAAoB,qLACmJ,CAAC;AAErL,qEAAqE;AACrE,eAAO,MAAM,cAAc,sMAC0K,CAAC;AAItM;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,OAAO,OAAO,sBAAsB;IAC7B,SAAS,CAAC,GAAG,EAAE,kBAAkB;IAA7C,YAAsB,GAAG,EAAE,kBAAkB,EAAI;IAEjD,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,cAAc,CAInB;IAEH,OAAO,CAAC,QAAQ,CAAoC;IAE9C,IAAI,kBAgBT;IAED,OAAO,CAAC,cAAc;IAmFtB;;;OAGG;YACW,OAAO;IAuBrB,yEAAyE;IACzE,OAAO,CAAC,iBAAiB;YAiDX,IAAI;IASlB;;;OAGG;YACW,YAAY;YAaZ,kBAAkB;IAOhC;;;;OAIG;YACW,OAAO;IA+BrB,uFAAuF;YACzE,QAAQ;CAqBvB"}
|