@absolutejs/absolute 0.19.0-beta.1049 → 0.19.0-beta.1050

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.
@@ -9,4 +9,5 @@ export declare const installFrameworkDependencies: (cwd: string, framework: Fram
9
9
  ok: boolean;
10
10
  specs: string[];
11
11
  };
12
+ export declare const installPackages: (cwd: string, specs: string[], dev?: boolean) => boolean;
12
13
  export {};
@@ -5,6 +5,11 @@ export declare const parseConfigObject: (configPath: string) => {
5
5
  object: ts.ObjectLiteralExpression | null;
6
6
  text: string;
7
7
  };
8
+ export declare const readAbsoluteConfigValues: (cwd: string, override?: string) => {
9
+ configPath: string | null;
10
+ current: Record<string, unknown>;
11
+ opaqueKeys: string[];
12
+ };
8
13
  export declare const resolveAbsoluteConfigState: (cwd: string, override?: string) => {
9
14
  available: boolean;
10
15
  configPath: string | null;
@@ -1,6 +1,6 @@
1
- import type { AbsoluteConfigState } from '../../../../types/absoluteConfig';
1
+ import type { IntegrationsPanelState } from '../../../../types/integrationsPanel';
2
2
  type IntegrationsPanelProps = {
3
- state: AbsoluteConfigState;
3
+ state: IntegrationsPanelState;
4
4
  };
5
5
  export declare const IntegrationsPanel: ({ state: initial }: IntegrationsPanelProps) => import("react/jsx-runtime").JSX.Element;
6
6
  export {};
@@ -1 +1 @@
1
- export declare const CONFIG_CSS = "\n.cfg {\n\tposition: relative;\n\tz-index: 1;\n\tdisplay: flex;\n\talign-items: stretch;\n\tmin-height: 100vh;\n}\n\n.cfg-nav {\n\tflex: 0 0 240px;\n\twidth: 240px;\n\theight: 100vh;\n\tposition: sticky;\n\ttop: 0;\n\talign-self: flex-start;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 26px;\n\tpadding: 30px 18px;\n\tborder-right: 1px solid var(--border);\n\tbackground: rgba(17, 19, 23, 0.6);\n}\n\n.cfg-brand { display: flex; flex-direction: column; gap: 4px; }\n.cfg-word { font-family: var(--serif); font-size: 26px; line-height: 1; }\n.cfg-word em { color: var(--accent); font-style: italic; }\n.cfg-tag {\n\tcolor: var(--faint);\n\tfont-size: 10px;\n\ttext-transform: uppercase;\n\tletter-spacing: 1.5px;\n}\n\n.cfg-panels { display: flex; flex-direction: column; gap: 4px; }\n.cfg-rail-label {\n\tcolor: var(--faint);\n\tfont-size: 10px;\n\ttext-transform: uppercase;\n\tletter-spacing: 1.5px;\n\tpadding: 0 10px 8px;\n}\n\n.cfg-item {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n\tpadding: 10px 12px;\n\tborder-radius: 8px;\n\tborder: 1px solid transparent;\n\tcolor: var(--text);\n\ttext-decoration: none;\n\ttransition: background 0.12s ease, border-color 0.12s ease;\n}\n.cfg-item:hover { background: var(--panel-2); }\n.cfg-item[data-active='true'] { background: var(--panel-2); border-color: var(--border); }\n.cfg-item[data-soon='true'] { opacity: 0.6; }\n.cfg-item-top { display: flex; align-items: center; justify-content: space-between; gap: 8px; }\n.cfg-item-name { font-weight: 500; font-size: 13px; }\n.cfg-item-blurb { color: var(--dim); font-size: 11px; }\n.cfg-soon {\n\tfont-size: 9px;\n\ttext-transform: uppercase;\n\tletter-spacing: 1px;\n\tcolor: var(--bg);\n\tbackground: var(--accent-dim);\n\tpadding: 2px 6px;\n\tborder-radius: 999px;\n}\n\n.cfg-main { flex: 1 1 auto; min-width: 0; }\n\n.cfg-placeholder {\n\tposition: relative;\n\tz-index: 1;\n\tmax-width: 760px;\n\tmargin: 0 auto;\n\tpadding: 120px 28px;\n\ttext-align: center;\n}\n.cfg-placeholder-title { font-family: var(--serif); font-size: 40px; margin-bottom: 12px; }\n.cfg-placeholder-title em { color: var(--accent); font-style: italic; }\n.cfg-placeholder-text { color: var(--dim); font-size: 14px; max-width: 460px; margin: 0 auto; }\n.cfg-loading { animation: cfg-pulse 1.2s ease-in-out infinite; }\n@keyframes cfg-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } }\n\n/* ---- recursive field editor ---- */\n.fe-block { align-items: flex-start; }\n.fe-root { margin-top: 10px; width: 100%; }\n.fe-actions { flex-direction: column; gap: 6px; }\n.fe-object {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 10px;\n\tborder-left: 2px solid var(--border);\n\tpadding-left: 14px;\n}\n.fe-field { display: flex; flex-direction: column; gap: 4px; }\n.fe-label { display: flex; align-items: center; gap: 8px; }\n.fe-name { color: var(--dim); font-size: 12px; }\n.fe-array, .fe-record, .fe-union { display: flex; flex-direction: column; gap: 6px; }\n.fe-item, .fe-entry { display: flex; align-items: flex-start; gap: 6px; }\n.fe-key { min-width: 160px; flex: 0 0 auto; }\n.fe-add {\n\talign-self: flex-start;\n\tfont-family: var(--mono);\n\tfont-size: 11px;\n\tcolor: var(--accent);\n\tbackground: transparent;\n\tborder: 1px dashed var(--border);\n\tborder-radius: 7px;\n\tpadding: 4px 10px;\n\tcursor: pointer;\n}\n.fe-add:hover { border-color: var(--accent); }\n.fe-remove {\n\tfont-family: var(--mono);\n\tfont-size: 11px;\n\tcolor: var(--dim);\n\tbackground: transparent;\n\tborder: 1px solid var(--border);\n\tborder-radius: 7px;\n\tpadding: 4px 8px;\n\tcursor: pointer;\n}\n.fe-remove:hover { color: var(--error); border-color: var(--error); }\n.fe-type { color: var(--faint); font-size: 11px; margin-top: 4px; }\n.fe-raw { width: 100%; }\n.fe-raw .opts-input { width: 100%; }\n\n/* ---- integrations panel ---- */\n.intg-note {\n\tfont-size: 11.5px;\n\tcolor: var(--warn);\n\tmargin-top: 6px;\n\tmax-width: 64ch;\n\tline-height: 1.45;\n}\n.intg-code {\n\tfont-family: var(--mono);\n\tfont-size: 11.5px;\n\tcolor: var(--accent-dim);\n\tbackground: var(--bg);\n\tborder: 1px solid var(--border);\n\tborder-radius: 7px;\n\tpadding: 7px 10px;\n\tmargin-top: 8px;\n\toverflow-x: auto;\n\twhite-space: pre;\n}\n\n/* ---- auth panel ---- */\n.auth-banner {\n\tfont-size: 12px;\n\tcolor: var(--dim);\n\tbackground: var(--panel);\n\tborder: 1px solid var(--border);\n\tborder-radius: 9px;\n\tpadding: 10px 14px;\n\tmargin-bottom: 18px;\n\tline-height: 1.5;\n}\n.auth-banner.warn { color: var(--warn); border-color: rgba(240, 180, 41, 0.25); }\n.auth-banner code { color: var(--accent-dim); }\n.auth-chips { display: flex; flex-wrap: wrap; gap: 7px; }\n.auth-chip {\n\tfont-family: var(--mono);\n\tfont-size: 11px;\n\tcolor: var(--dim);\n\tbackground: var(--bg);\n\tborder: 1px solid var(--border);\n\tborder-radius: 7px;\n\tpadding: 4px 9px;\n}\n.auth-links { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 10px; }\n.auth-link { font-size: 12px; color: var(--accent); text-decoration: none; }\n.auth-link:hover { text-decoration: underline; }\n\n@media (max-width: 720px) {\n\t.cfg { flex-direction: column; }\n\t.cfg-nav {\n\t\twidth: auto;\n\t\tflex-basis: auto;\n\t\theight: auto;\n\t\tposition: static;\n\t\tborder-right: none;\n\t\tborder-bottom: 1px solid var(--border);\n\t}\n}\n";
1
+ export declare const CONFIG_CSS = "\n.cfg {\n\tposition: relative;\n\tz-index: 1;\n\tdisplay: flex;\n\talign-items: stretch;\n\tmin-height: 100vh;\n}\n\n.cfg-nav {\n\tflex: 0 0 240px;\n\twidth: 240px;\n\theight: 100vh;\n\tposition: sticky;\n\ttop: 0;\n\talign-self: flex-start;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 26px;\n\tpadding: 30px 18px;\n\tborder-right: 1px solid var(--border);\n\tbackground: rgba(17, 19, 23, 0.6);\n}\n\n.cfg-brand { display: flex; flex-direction: column; gap: 4px; }\n.cfg-word { font-family: var(--serif); font-size: 26px; line-height: 1; }\n.cfg-word em { color: var(--accent); font-style: italic; }\n.cfg-tag {\n\tcolor: var(--faint);\n\tfont-size: 10px;\n\ttext-transform: uppercase;\n\tletter-spacing: 1.5px;\n}\n\n.cfg-panels { display: flex; flex-direction: column; gap: 4px; }\n.cfg-rail-label {\n\tcolor: var(--faint);\n\tfont-size: 10px;\n\ttext-transform: uppercase;\n\tletter-spacing: 1.5px;\n\tpadding: 0 10px 8px;\n}\n\n.cfg-item {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n\tpadding: 10px 12px;\n\tborder-radius: 8px;\n\tborder: 1px solid transparent;\n\tcolor: var(--text);\n\ttext-decoration: none;\n\ttransition: background 0.12s ease, border-color 0.12s ease;\n}\n.cfg-item:hover { background: var(--panel-2); }\n.cfg-item[data-active='true'] { background: var(--panel-2); border-color: var(--border); }\n.cfg-item[data-soon='true'] { opacity: 0.6; }\n.cfg-item-top { display: flex; align-items: center; justify-content: space-between; gap: 8px; }\n.cfg-item-name { font-weight: 500; font-size: 13px; }\n.cfg-item-blurb { color: var(--dim); font-size: 11px; }\n.cfg-soon {\n\tfont-size: 9px;\n\ttext-transform: uppercase;\n\tletter-spacing: 1px;\n\tcolor: var(--bg);\n\tbackground: var(--accent-dim);\n\tpadding: 2px 6px;\n\tborder-radius: 999px;\n}\n\n.cfg-main { flex: 1 1 auto; min-width: 0; }\n\n.cfg-placeholder {\n\tposition: relative;\n\tz-index: 1;\n\tmax-width: 760px;\n\tmargin: 0 auto;\n\tpadding: 120px 28px;\n\ttext-align: center;\n}\n.cfg-placeholder-title { font-family: var(--serif); font-size: 40px; margin-bottom: 12px; }\n.cfg-placeholder-title em { color: var(--accent); font-style: italic; }\n.cfg-placeholder-text { color: var(--dim); font-size: 14px; max-width: 460px; margin: 0 auto; }\n.cfg-loading { animation: cfg-pulse 1.2s ease-in-out infinite; }\n@keyframes cfg-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } }\n\n/* ---- recursive field editor ---- */\n.fe-block { align-items: flex-start; }\n.fe-root { margin-top: 10px; width: 100%; }\n.fe-actions { flex-direction: column; gap: 6px; }\n.fe-object {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 10px;\n\tborder-left: 2px solid var(--border);\n\tpadding-left: 14px;\n}\n.fe-field { display: flex; flex-direction: column; gap: 4px; }\n.fe-label { display: flex; align-items: center; gap: 8px; }\n.fe-name { color: var(--dim); font-size: 12px; }\n.fe-array, .fe-record, .fe-union { display: flex; flex-direction: column; gap: 6px; }\n.fe-item, .fe-entry { display: flex; align-items: flex-start; gap: 6px; }\n.fe-key { min-width: 160px; flex: 0 0 auto; }\n.fe-add {\n\talign-self: flex-start;\n\tfont-family: var(--mono);\n\tfont-size: 11px;\n\tcolor: var(--accent);\n\tbackground: transparent;\n\tborder: 1px dashed var(--border);\n\tborder-radius: 7px;\n\tpadding: 4px 10px;\n\tcursor: pointer;\n}\n.fe-add:hover { border-color: var(--accent); }\n.fe-remove {\n\tfont-family: var(--mono);\n\tfont-size: 11px;\n\tcolor: var(--dim);\n\tbackground: transparent;\n\tborder: 1px solid var(--border);\n\tborder-radius: 7px;\n\tpadding: 4px 8px;\n\tcursor: pointer;\n}\n.fe-remove:hover { color: var(--error); border-color: var(--error); }\n.fe-type { color: var(--faint); font-size: 11px; margin-top: 4px; }\n.fe-raw { width: 100%; }\n.fe-raw .opts-input { width: 100%; }\n\n/* ---- integrations panel ---- */\n.intg-note {\n\tfont-size: 11.5px;\n\tcolor: var(--warn);\n\tmargin-top: 6px;\n\tmax-width: 64ch;\n\tline-height: 1.45;\n}\n.intg-code {\n\tfont-family: var(--mono);\n\tfont-size: 11.5px;\n\tcolor: var(--accent-dim);\n\tbackground: var(--bg);\n\tborder: 1px solid var(--border);\n\tborder-radius: 7px;\n\tpadding: 7px 10px;\n\tmargin-top: 8px;\n\toverflow-x: auto;\n\twhite-space: pre;\n}\n\n/* ---- auth panel ---- */\n.auth-banner {\n\tfont-size: 12px;\n\tcolor: var(--dim);\n\tbackground: var(--panel);\n\tborder: 1px solid var(--border);\n\tborder-radius: 9px;\n\tpadding: 10px 14px;\n\tmargin-bottom: 18px;\n\tline-height: 1.5;\n}\n.auth-banner.warn { color: var(--warn); border-color: rgba(240, 180, 41, 0.25); }\n.auth-banner code { color: var(--accent-dim); }\n.auth-chips { display: flex; flex-wrap: wrap; gap: 7px; }\n.auth-chip {\n\tfont-family: var(--mono);\n\tfont-size: 11px;\n\tcolor: var(--dim);\n\tbackground: var(--bg);\n\tborder: 1px solid var(--border);\n\tborder-radius: 7px;\n\tpadding: 4px 9px;\n}\n.auth-links { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 10px; }\n.auth-link { font-size: 12px; color: var(--accent); text-decoration: none; }\n.auth-link:hover { text-decoration: underline; }\n\n/* ---- grouped sidebar ---- */\n.cfg-group + .cfg-group { margin-top: 16px; }\n\n@media (max-width: 720px) {\n\t.cfg { flex-direction: column; }\n\t.cfg-nav {\n\t\twidth: auto;\n\t\tflex-basis: auto;\n\t\theight: auto;\n\t\tposition: static;\n\t\tborder-right: none;\n\t\tborder-bottom: 1px solid var(--border);\n\t}\n}\n";
@@ -3,6 +3,7 @@ import type { RuleEditResult } from '../../../types/eslintConfig';
3
3
  import type { TsEditResult } from '../../../types/tsconfig';
4
4
  import type { PrettierEditResult } from '../../../types/prettier';
5
5
  import type { AbsoluteConfigEditResult } from '../../../types/absoluteConfig';
6
+ import type { IntegrationAddResult } from '../../../types/integrationsPanel';
6
7
  import type { PackageJsonEditResult } from '../../../types/packageJsonPanel';
7
8
  export declare const launchConfig: (args: string[], cwd?: string) => Promise<Elysia<"", {
8
9
  decorator: {};
@@ -256,6 +257,36 @@ export declare const launchConfig: (args: string[], cwd?: string) => Promise<Ely
256
257
  };
257
258
  };
258
259
  };
260
+ } & {
261
+ api: {
262
+ integrations: {
263
+ get: {
264
+ body: unknown;
265
+ params: {};
266
+ query: unknown;
267
+ headers: unknown;
268
+ response: {
269
+ 200: import("../../../types/integrationsPanel").IntegrationsPanelState;
270
+ };
271
+ };
272
+ };
273
+ };
274
+ } & {
275
+ api: {
276
+ integrations: {
277
+ add: {
278
+ post: {
279
+ body: unknown;
280
+ params: {};
281
+ query: unknown;
282
+ headers: unknown;
283
+ response: {
284
+ 200: IntegrationAddResult;
285
+ };
286
+ };
287
+ };
288
+ };
289
+ };
259
290
  } & {
260
291
  api: {
261
292
  auth: {
@@ -0,0 +1,8 @@
1
+ import type { IntegrationAddResult, IntegrationsPanelState } from '../../../types/integrationsPanel';
2
+ type AddOptions = {
3
+ install?: boolean;
4
+ override?: string;
5
+ };
6
+ export declare const resolveIntegrationsState: (cwd: string, override?: string) => IntegrationsPanelState;
7
+ export declare const addIntegration: (cwd: string, id: string, options?: AddOptions) => IntegrationAddResult;
8
+ export {};
@@ -0,0 +1,20 @@
1
+ export type IntegrationWiring = {
2
+ field: string;
3
+ kind: 'config';
4
+ } | {
5
+ importLine: string;
6
+ kind: 'use';
7
+ useLine: string;
8
+ };
9
+ type IntegrationMeta = {
10
+ blurb: string;
11
+ id: string;
12
+ label: string;
13
+ note?: string;
14
+ packages: string[];
15
+ wiring: IntegrationWiring;
16
+ };
17
+ export declare const INTEGRATIONS: IntegrationMeta[];
18
+ export declare const findIntegration: (id: string) => IntegrationMeta | null;
19
+ export declare const isIntegrationId: (value: string) => boolean;
20
+ export {};
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Strip string literals (single-quote, double-quote, and template — including
3
+ * `${}` interpolations and nested templates) plus comments (line and block)
4
+ * from TypeScript/JavaScript source, returning only the code that lives
5
+ * outside those contexts.
6
+ *
7
+ * Heuristic content checks — e.g. "is this a real Angular `@Component`
8
+ * source?" — must run against the result, not the raw text. A naive regex
9
+ * strip mis-pairs quotes whenever a quote or backtick appears inside a
10
+ * differently-quoted string or a comment (inline-code backticks in JSDoc, an
11
+ * apostrophe in a comment, a backtick inside a single-quoted string), leaving
12
+ * the matched text behind and producing false positives.
13
+ *
14
+ * Regex literals are intentionally left intact: telling `/` division apart
15
+ * from a regex needs a full parser, and their contents have never mattered for
16
+ * the checks this supports.
17
+ */
18
+ export declare const stripStringsAndComments: (source: string) => string;
@@ -3,6 +3,8 @@ export type ConfigPanelStatus = 'ready' | 'soon';
3
3
  export type ConfigPanelMeta = {
4
4
  /** One-line description shown under the panel name in the sidebar. */
5
5
  blurb: string;
6
+ /** Sidebar section heading this panel is grouped under. */
7
+ group: string;
6
8
  id: ConfigPanelId;
7
9
  label: string;
8
10
  /** `'ready'` panels are interactive; `'soon'` panels render a placeholder. */
@@ -0,0 +1,29 @@
1
+ /** One integration's live status in a project. `config`-kind integrations wire by
2
+ * toggling an absolute.config field (the runtime mounts them); `use`-kind ones are
3
+ * installed but the consumer adds the `.use(...)` to their own server, so we report
4
+ * the snippet instead of auto-editing their entry. */
5
+ export type IntegrationItem = {
6
+ blurb: string;
7
+ enabled: boolean;
8
+ id: string;
9
+ installed: boolean;
10
+ kind: 'config' | 'use';
11
+ label: string;
12
+ note: string | null;
13
+ packages: string[];
14
+ wiringSnippet: string | null;
15
+ };
16
+ export type IntegrationsPanelState = {
17
+ configPath: string | null;
18
+ items: IntegrationItem[];
19
+ };
20
+ /** Result of `addIntegration` — shared by the CLI (`absolute add <plugin>`) and the
21
+ * config:studio panel's install button. */
22
+ export type IntegrationAddResult = {
23
+ installed: boolean;
24
+ item: IntegrationItem | null;
25
+ message: string;
26
+ ok: boolean;
27
+ wired: boolean;
28
+ wiringSnippet: string | null;
29
+ };
package/package.json CHANGED
@@ -413,7 +413,7 @@
413
413
  ]
414
414
  }
415
415
  },
416
- "version": "0.19.0-beta.1049",
416
+ "version": "0.19.0-beta.1050",
417
417
  "workspaces": [
418
418
  "tests/fixtures/*",
419
419
  "tests/fixtures/_packages/*"