tin-spa 20.14.99 → 20.14.113

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.
Files changed (51) hide show
  1. package/core/index.d.ts +3033 -0
  2. package/fesm2022/tin-spa-accounting.module-Cg4vWaJE.mjs +2231 -0
  3. package/fesm2022/tin-spa-accounting.module-Cg4vWaJE.mjs.map +1 -0
  4. package/fesm2022/tin-spa-agent-page.component-DJvMPjCQ.mjs +39 -0
  5. package/fesm2022/tin-spa-agent-page.component-DJvMPjCQ.mjs.map +1 -0
  6. package/fesm2022/tin-spa-agent.component-D0CGGnGZ.mjs +1379 -0
  7. package/fesm2022/tin-spa-agent.component-D0CGGnGZ.mjs.map +1 -0
  8. package/fesm2022/tin-spa-assets.module-qIWNwJ2E.mjs +167 -0
  9. package/fesm2022/tin-spa-assets.module-qIWNwJ2E.mjs.map +1 -0
  10. package/fesm2022/tin-spa-core.mjs +13628 -0
  11. package/fesm2022/tin-spa-core.mjs.map +1 -0
  12. package/fesm2022/tin-spa-general-erp.module-CoYxceLj.mjs +138 -0
  13. package/fesm2022/tin-spa-general-erp.module-CoYxceLj.mjs.map +1 -0
  14. package/fesm2022/tin-spa-hr.module-CKPZ9ZOj.mjs +134 -0
  15. package/fesm2022/tin-spa-hr.module-CKPZ9ZOj.mjs.map +1 -0
  16. package/fesm2022/tin-spa-http.mjs +117 -0
  17. package/fesm2022/tin-spa-http.mjs.map +1 -0
  18. package/fesm2022/tin-spa-inventory.module-DRKAcNau.mjs +338 -0
  19. package/fesm2022/tin-spa-inventory.module-DRKAcNau.mjs.map +1 -0
  20. package/fesm2022/tin-spa-keys.mjs +14 -0
  21. package/fesm2022/tin-spa-keys.mjs.map +1 -0
  22. package/fesm2022/tin-spa-landing.mjs +189 -0
  23. package/fesm2022/tin-spa-landing.mjs.map +1 -0
  24. package/fesm2022/tin-spa-loans.module-BTDmgrWo.mjs +115 -0
  25. package/fesm2022/tin-spa-loans.module-BTDmgrWo.mjs.map +1 -0
  26. package/fesm2022/tin-spa-login.mjs +719 -0
  27. package/fesm2022/tin-spa-login.mjs.map +1 -0
  28. package/fesm2022/tin-spa-manufacturing.module-CHta6oV_.mjs +96 -0
  29. package/fesm2022/tin-spa-manufacturing.module-CHta6oV_.mjs.map +1 -0
  30. package/fesm2022/tin-spa-map.mjs +750 -0
  31. package/fesm2022/tin-spa-map.mjs.map +1 -0
  32. package/fesm2022/tin-spa-payroll.module-CZ_GO1jF.mjs +847 -0
  33. package/fesm2022/tin-spa-payroll.module-CZ_GO1jF.mjs.map +1 -0
  34. package/fesm2022/tin-spa-purchasing.module-NCdwquaF.mjs +161 -0
  35. package/fesm2022/tin-spa-purchasing.module-NCdwquaF.mjs.map +1 -0
  36. package/fesm2022/tin-spa-sales.module-D0uEGJW7.mjs +1346 -0
  37. package/fesm2022/tin-spa-sales.module-D0uEGJW7.mjs.map +1 -0
  38. package/fesm2022/tin-spa-tenancy-erp.module-GwIv8Wbc.mjs +932 -0
  39. package/fesm2022/tin-spa-tenancy-erp.module-GwIv8Wbc.mjs.map +1 -0
  40. package/fesm2022/tin-spa-tin-spa-Cqe5hYTr.mjs +22576 -0
  41. package/fesm2022/tin-spa-tin-spa-Cqe5hYTr.mjs.map +1 -0
  42. package/fesm2022/tin-spa.mjs +2 -42079
  43. package/fesm2022/tin-spa.mjs.map +1 -1
  44. package/http/index.d.ts +16 -0
  45. package/index.d.ts +588 -4687
  46. package/keys/index.d.ts +4 -0
  47. package/landing/index.d.ts +175 -0
  48. package/login/index.d.ts +141 -0
  49. package/map/index.d.ts +148 -0
  50. package/package.json +25 -1
  51. package/src/tin-styles.css +81 -2
@@ -0,0 +1,138 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, Component, NgModule } from '@angular/core';
3
+ import * as i1 from '@angular/router';
4
+ import { RouterModule } from '@angular/router';
5
+ import { CommonModule } from '@angular/common';
6
+ import { P as PageComponent, c as TinSpaModule, e as SpaAdminModule } from './tin-spa-tin-spa-Cqe5hYTr.mjs';
7
+ import { DataServiceLib, MessageService, AuthService, GeneralService } from 'tin-spa/core';
8
+
9
+ class CustomersComponent {
10
+ constructor() {
11
+ this.dataService = inject(DataServiceLib);
12
+ this.pageConfig = {
13
+ title: 'Customers',
14
+ tableConfig: this.dataService.customersTableConfig
15
+ };
16
+ }
17
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: CustomersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: CustomersComponent, isStandalone: false, selector: "spa-customers", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
19
+ }
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: CustomersComponent, decorators: [{
21
+ type: Component,
22
+ args: [{
23
+ selector: 'spa-customers',
24
+ standalone: false,
25
+ template: '<spa-page [config]="pageConfig"></spa-page>'
26
+ }]
27
+ }] });
28
+
29
+ class SuppliersComponent {
30
+ constructor() {
31
+ this.dataService = inject(DataServiceLib);
32
+ this.messageService = inject(MessageService);
33
+ this.authService = inject(AuthService);
34
+ this.pageConfig = {
35
+ title: 'Suppliers',
36
+ tableConfig: this.dataService.suppliersTableConfig
37
+ };
38
+ }
39
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SuppliersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
40
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: SuppliersComponent, isStandalone: false, selector: "spa-suppliers", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
41
+ }
42
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SuppliersComponent, decorators: [{
43
+ type: Component,
44
+ args: [{
45
+ selector: 'spa-suppliers',
46
+ standalone: false,
47
+ template: '<spa-page [config]="pageConfig"></spa-page>'
48
+ }]
49
+ }] });
50
+
51
+ class CategoriesComponent {
52
+ constructor() {
53
+ this.generalService = inject(GeneralService);
54
+ this.pageConfig = {
55
+ title: 'Categories',
56
+ tableConfig: this.generalService.categoriesTableConfig
57
+ };
58
+ }
59
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: CategoriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
60
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: CategoriesComponent, isStandalone: true, selector: "spa-categories", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
61
+ }
62
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: CategoriesComponent, decorators: [{
63
+ type: Component,
64
+ args: [{
65
+ selector: 'spa-categories',
66
+ standalone: true,
67
+ imports: [TinSpaModule],
68
+ template: '<spa-page [config]="pageConfig"></spa-page>'
69
+ }]
70
+ }] });
71
+
72
+ class SubCategoriesComponent {
73
+ constructor() {
74
+ this.generalService = inject(GeneralService);
75
+ this.pageConfig = {
76
+ title: 'Sub Categories',
77
+ tableConfig: this.generalService.subCategoriesTableConfig
78
+ };
79
+ }
80
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SubCategoriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
81
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: SubCategoriesComponent, isStandalone: true, selector: "spa-subcategories", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
82
+ }
83
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SubCategoriesComponent, decorators: [{
84
+ type: Component,
85
+ args: [{
86
+ selector: 'spa-subcategories',
87
+ standalone: true,
88
+ imports: [TinSpaModule],
89
+ template: '<spa-page [config]="pageConfig"></spa-page>'
90
+ }]
91
+ }] });
92
+
93
+ class BrandsComponent {
94
+ constructor() {
95
+ this.generalService = inject(GeneralService);
96
+ this.pageConfig = {
97
+ title: 'Brands',
98
+ tableConfig: this.generalService.brandsTableConfig
99
+ };
100
+ }
101
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: BrandsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
102
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: BrandsComponent, isStandalone: true, selector: "spa-brands", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "ngmodule", type: TinSpaModule }, { kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
103
+ }
104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: BrandsComponent, decorators: [{
105
+ type: Component,
106
+ args: [{
107
+ selector: 'spa-brands',
108
+ standalone: true,
109
+ imports: [TinSpaModule],
110
+ template: '<spa-page [config]="pageConfig"></spa-page>'
111
+ }]
112
+ }] });
113
+
114
+ // Added (S10-part-1): the five ERP leaves that used to sit inside the CORE GeneralModule — customers,
115
+ // suppliers, categories, subcategories, brands. They keep their exact URLs (home/general/<leaf>); only their
116
+ // LOADING changed. GeneralModule stays eager and keeps its one non-ERP leaf, tasks.
117
+ const GENERAL_ERP_ROUTES = [
118
+ { path: "customers", component: CustomersComponent },
119
+ { path: "suppliers", component: SuppliersComponent },
120
+ { path: "categories", component: CategoriesComponent },
121
+ { path: "subcategories", component: SubCategoriesComponent },
122
+ { path: "brands", component: BrandsComponent }
123
+ ];
124
+ class GeneralErpModule {
125
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: GeneralErpModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
126
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.14", ngImport: i0, type: GeneralErpModule, declarations: [CustomersComponent, SuppliersComponent], imports: [CommonModule, SpaAdminModule, CategoriesComponent, SubCategoriesComponent, BrandsComponent, i1.RouterModule] }); }
127
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: GeneralErpModule, imports: [CommonModule, SpaAdminModule, CategoriesComponent, SubCategoriesComponent, BrandsComponent, RouterModule.forChild(GENERAL_ERP_ROUTES)] }); }
128
+ }
129
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: GeneralErpModule, decorators: [{
130
+ type: NgModule,
131
+ args: [{
132
+ declarations: [CustomersComponent, SuppliersComponent], // the other three are standalone
133
+ imports: [CommonModule, SpaAdminModule, CategoriesComponent, SubCategoriesComponent, BrandsComponent, RouterModule.forChild(GENERAL_ERP_ROUTES)]
134
+ }]
135
+ }] });
136
+
137
+ export { GENERAL_ERP_ROUTES, GeneralErpModule };
138
+ //# sourceMappingURL=tin-spa-general-erp.module-CoYxceLj.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tin-spa-general-erp.module-CoYxceLj.mjs","sources":["../../../projects/tin-spa/src/lib/pages/customers/customers.component.ts","../../../projects/tin-spa/src/lib/pages/suppliers/suppliers.component.ts","../../../projects/tin-spa/src/lib/pages/categories/categories.component.ts","../../../projects/tin-spa/src/lib/pages/subcategories/subcategories.component.ts","../../../projects/tin-spa/src/lib/pages/brands/brands.component.ts","../../../projects/tin-spa/src/lib/modules/general-erp/general-erp.module.ts"],"sourcesContent":["import { Component, inject } from '@angular/core';\nimport { DataServiceLib } from 'tin-spa/core';\nimport { PageConfig } from 'tin-spa/core';\n\n\n@Component({\n selector: 'spa-customers',\n standalone: false,\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class CustomersComponent {\n private dataService = inject(DataServiceLib);\n \n pageConfig: PageConfig = {\n title: 'Customers',\n tableConfig: this.dataService.customersTableConfig\n };\n\n}\n","import { Component, inject } from '@angular/core';\nimport { DataServiceLib } from 'tin-spa/core';\nimport { PageConfig } from 'tin-spa/core';\nimport { MessageService } from 'tin-spa/core';\nimport { AuthService } from 'tin-spa/core';\n\n\n@Component({\n selector: 'spa-suppliers',\n standalone: false,\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class SuppliersComponent {\n private dataService = inject(DataServiceLib);\n private messageService = inject(MessageService);\n private authService = inject(AuthService);\n \n pageConfig: PageConfig = {\n title: 'Suppliers',\n tableConfig: this.dataService.suppliersTableConfig\n };\n\n\n\n}\n","import { Component, inject } from '@angular/core';\nimport { PageConfig } from 'tin-spa/core';\nimport { TinSpaModule } from '../../tin-spa.module';\nimport { GeneralService } from 'tin-spa/core';\n\n\n@Component({\n selector: 'spa-categories',\n standalone: true,\n imports: [TinSpaModule],\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class CategoriesComponent {\n private generalService = inject(GeneralService);\n \n pageConfig: PageConfig = {\n title: 'Categories',\n tableConfig: this.generalService.categoriesTableConfig\n };\n}\n","import { Component, inject } from '@angular/core';\nimport { PageConfig } from 'tin-spa/core';\nimport { TinSpaModule } from '../../tin-spa.module';\nimport { GeneralService } from 'tin-spa/core';\n\n\n@Component({\n selector: 'spa-subcategories',\n standalone: true,\n imports: [TinSpaModule],\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class SubCategoriesComponent {\n private generalService = inject(GeneralService);\n \n pageConfig: PageConfig = {\n title: 'Sub Categories',\n tableConfig: this.generalService.subCategoriesTableConfig\n };\n}\n","import { Component, inject } from '@angular/core';\nimport { PageConfig } from 'tin-spa/core';\nimport { TinSpaModule } from '../../tin-spa.module';\nimport { GeneralService } from 'tin-spa/core';\n\n\n@Component({\n selector: 'spa-brands',\n standalone: true,\n imports: [TinSpaModule],\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class BrandsComponent {\n private generalService = inject(GeneralService);\n \n pageConfig: PageConfig = {\n title: 'Brands',\n tableConfig: this.generalService.brandsTableConfig\n };\n}\n","// Added (S10-part-1): the five ERP leaves that used to sit inside the CORE GeneralModule — customers,\n// suppliers, categories, subcategories, brands. They keep their exact URLs (home/general/<leaf>); only their\n// LOADING changed. GeneralModule stays eager and keeps its one non-ERP leaf, tasks.\nimport { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { SpaAdminModule } from '../spa-admin.module';\nimport { CustomersComponent } from '../../pages/customers/customers.component';\nimport { SuppliersComponent } from '../../pages/suppliers/suppliers.component';\nimport { CategoriesComponent } from '../../pages/categories/categories.component';\nimport { SubCategoriesComponent } from '../../pages/subcategories/subcategories.component';\nimport { BrandsComponent } from '../../pages/brands/brands.component';\n\nexport const GENERAL_ERP_ROUTES: Routes = [\n { path: \"customers\", component: CustomersComponent },\n { path: \"suppliers\", component: SuppliersComponent },\n { path: \"categories\", component: CategoriesComponent },\n { path: \"subcategories\", component: SubCategoriesComponent },\n { path: \"brands\", component: BrandsComponent }\n];\n\n@NgModule({\n declarations: [CustomersComponent, SuppliersComponent], // the other three are standalone\n imports: [CommonModule, SpaAdminModule, CategoriesComponent, SubCategoriesComponent, BrandsComponent, RouterModule.forChild(GENERAL_ERP_ROUTES)]\n})\nexport class GeneralErpModule { }\n"],"names":["i1.PageComponent"],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, Component, NgModule } from '@angular/core';
3
+ import * as i1 from '@angular/router';
4
+ import { RouterModule } from '@angular/router';
5
+ import { DataServiceLib, AuthService, MessageService } from 'tin-spa/core';
6
+ import { P as PageComponent, e as SpaAdminModule } from './tin-spa-tin-spa-Cqe5hYTr.mjs';
7
+ import { CommonModule } from '@angular/common';
8
+
9
+ class EmployeesComponent {
10
+ constructor() {
11
+ this.dataService = inject(DataServiceLib);
12
+ this.authService = inject(AuthService);
13
+ this.pageConfig = {
14
+ title: 'Employees',
15
+ tableConfig: this.dataService.employeesTableConfig
16
+ };
17
+ }
18
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: EmployeesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
19
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: EmployeesComponent, isStandalone: false, selector: "spa-employees", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
20
+ }
21
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: EmployeesComponent, decorators: [{
22
+ type: Component,
23
+ args: [{
24
+ selector: 'spa-employees',
25
+ standalone: false,
26
+ template: '<spa-page [config]="pageConfig"></spa-page>'
27
+ }]
28
+ }] });
29
+
30
+ class DepartmentsComponent {
31
+ constructor() {
32
+ this.dataService = inject(DataServiceLib);
33
+ this.messageService = inject(MessageService);
34
+ this.authService = inject(AuthService);
35
+ this.pageConfig = {
36
+ title: 'Departments',
37
+ tableConfig: this.dataService.departmentTableConfig
38
+ };
39
+ }
40
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: DepartmentsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
41
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: DepartmentsComponent, isStandalone: false, selector: "spa-departments", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
42
+ }
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: DepartmentsComponent, decorators: [{
44
+ type: Component,
45
+ args: [{
46
+ selector: 'spa-departments',
47
+ standalone: false,
48
+ template: '<spa-page [config]="pageConfig"></spa-page>'
49
+ }]
50
+ }] });
51
+
52
+ class PositionsComponent {
53
+ constructor() {
54
+ this.dataService = inject(DataServiceLib);
55
+ this.authService = inject(AuthService);
56
+ this.pageConfig = {
57
+ title: 'Positions',
58
+ tableConfig: this.dataService.positionsTableConfig
59
+ };
60
+ }
61
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: PositionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
62
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: PositionsComponent, isStandalone: false, selector: "spa-positions", ngImport: i0, template: '<spa-page [config]="pageConfig"></spa-page>', isInline: true, dependencies: [{ kind: "component", type: PageComponent, selector: "spa-page", inputs: ["config"], outputs: ["searchModeActivated", "searchModeDeactivated", "refreshClick", "actionClick", "actionResponse", "inputChange", "createClick", "searchClick", "dataLoad", "titleActionChange"] }] }); }
63
+ }
64
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: PositionsComponent, decorators: [{
65
+ type: Component,
66
+ args: [{
67
+ selector: 'spa-positions',
68
+ standalone: false,
69
+ template: '<spa-page [config]="pageConfig"></spa-page>'
70
+ }]
71
+ }] });
72
+
73
+ class GradesComponent {
74
+ constructor() { }
75
+ ngOnInit() {
76
+ }
77
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: GradesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
78
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: GradesComponent, isStandalone: false, selector: "spa-grades", ngImport: i0, template: "<h4>Grades</h4>\n<hr>\n", styles: [""] }); }
79
+ }
80
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: GradesComponent, decorators: [{
81
+ type: Component,
82
+ args: [{ selector: 'spa-grades', standalone: false, template: "<h4>Grades</h4>\n<hr>\n" }]
83
+ }], ctorParameters: () => [] });
84
+
85
+ const HR_ROUTES = [
86
+ { path: "employees", component: EmployeesComponent },
87
+ { path: "departments", component: DepartmentsComponent },
88
+ { path: "positions", component: PositionsComponent },
89
+ { path: "grades", component: GradesComponent },
90
+ ];
91
+ class HRRoutingModule {
92
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: HRRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
93
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.14", ngImport: i0, type: HRRoutingModule, imports: [i1.RouterModule], exports: [RouterModule] }); }
94
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: HRRoutingModule, imports: [RouterModule.forChild(HR_ROUTES), RouterModule] }); }
95
+ }
96
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: HRRoutingModule, decorators: [{
97
+ type: NgModule,
98
+ args: [{
99
+ imports: [RouterModule.forChild(HR_ROUTES)],
100
+ exports: [RouterModule]
101
+ }]
102
+ }] });
103
+
104
+ class HRModule {
105
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: HRModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
106
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.14", ngImport: i0, type: HRModule, declarations: [EmployeesComponent,
107
+ DepartmentsComponent,
108
+ PositionsComponent,
109
+ GradesComponent], imports: [HRRoutingModule,
110
+ CommonModule,
111
+ SpaAdminModule] }); }
112
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: HRModule, imports: [HRRoutingModule,
113
+ CommonModule,
114
+ SpaAdminModule] }); }
115
+ }
116
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: HRModule, decorators: [{
117
+ type: NgModule,
118
+ args: [{
119
+ declarations: [
120
+ EmployeesComponent,
121
+ DepartmentsComponent,
122
+ PositionsComponent,
123
+ GradesComponent,
124
+ ],
125
+ imports: [
126
+ HRRoutingModule,
127
+ CommonModule,
128
+ SpaAdminModule
129
+ ]
130
+ }]
131
+ }] });
132
+
133
+ export { HRModule };
134
+ //# sourceMappingURL=tin-spa-hr.module-CKPZ9ZOj.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tin-spa-hr.module-CKPZ9ZOj.mjs","sources":["../../../projects/tin-spa/src/lib/pages/employees/employees.component.ts","../../../projects/tin-spa/src/lib/pages/departments/departments.component.ts","../../../projects/tin-spa/src/lib/pages/positions/positions.component.ts","../../../projects/tin-spa/src/lib/pages/grades/grades.component.ts","../../../projects/tin-spa/src/lib/pages/grades/grades.component.html","../../../projects/tin-spa/src/lib/modules/hr/hr-routing.module.ts","../../../projects/tin-spa/src/lib/modules/hr/hr.module.ts"],"sourcesContent":["import { Component, inject } from '@angular/core';\nimport { DataServiceLib } from 'tin-spa/core';\nimport { PageConfig } from 'tin-spa/core';\nimport { AuthService } from 'tin-spa/core';\n\n\n@Component({\n selector: 'spa-employees',\n standalone: false,\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class EmployeesComponent {\n private dataService = inject(DataServiceLib);\n private authService = inject(AuthService);\n \n pageConfig: PageConfig = {\n title: 'Employees',\n tableConfig: this.dataService.employeesTableConfig\n };\n}\n","import { Component, inject } from '@angular/core';\nimport { DataServiceLib } from 'tin-spa/core';\nimport { PageConfig } from 'tin-spa/core';\nimport { MessageService } from 'tin-spa/core';\nimport { AuthService } from 'tin-spa/core';\n\n\n@Component({\n selector: 'spa-departments',\n standalone: false,\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class DepartmentsComponent {\n private dataService = inject(DataServiceLib);\n private messageService = inject(MessageService);\n private authService = inject(AuthService);\n \n pageConfig: PageConfig = {\n title: 'Departments',\n tableConfig: this.dataService.departmentTableConfig\n };\n}\n","import { Component, inject } from '@angular/core';\nimport { AuthService } from 'tin-spa/core';\nimport { DataServiceLib } from 'tin-spa/core';\nimport { PageConfig } from 'tin-spa/core';\n\n\n@Component({\n selector: 'spa-positions',\n standalone: false,\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class PositionsComponent {\n private dataService = inject(DataServiceLib);\n private authService = inject(AuthService);\n \n pageConfig: PageConfig = {\n title: 'Positions',\n tableConfig: this.dataService.positionsTableConfig\n };\n}\n","import { Component, OnInit } from '@angular/core';\n\n@Component({\n selector: 'spa-grades',\n templateUrl: './grades.component.html',\n styleUrls: ['./grades.component.css'],\n standalone: false\n})\nexport class GradesComponent implements OnInit {\n\n constructor() { }\n\n ngOnInit(): void {\n }\n\n}\n","<h4>Grades</h4>\n<hr>\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\nimport { EmployeesComponent } from '../../pages/employees/employees.component';\nimport { DepartmentsComponent } from '../../pages/departments/departments.component';\nimport { PositionsComponent } from '../../pages/positions/positions.component';\nimport { GradesComponent } from '../../pages/grades/grades.component';\n\nexport const HR_ROUTES: Routes = [\n { path: \"employees\", component: EmployeesComponent },\n { path: \"departments\", component: DepartmentsComponent },\n { path: \"positions\", component: PositionsComponent },\n { path: \"grades\", component: GradesComponent },\n];\n\n@NgModule({\n imports: [RouterModule.forChild(HR_ROUTES)],\n exports: [RouterModule]\n})\nexport class HRRoutingModule { }\n","import { NgModule } from '@angular/core';\nimport { HRRoutingModule } from './hr-routing.module'; // Added (S10-part-1): this domain is now reached by loadChildren, so it carries its own RouterModule.forChild table instead of contributing routes to the eager parent\nimport { CommonModule } from '@angular/common';\nimport { SpaAdminModule } from '../spa-admin.module';\nimport { EmployeesComponent } from '../../pages/employees/employees.component';\nimport { DepartmentsComponent } from '../../pages/departments/departments.component';\nimport { PositionsComponent } from '../../pages/positions/positions.component';\nimport { GradesComponent } from '../../pages/grades/grades.component';\n\n@NgModule({\n declarations: [\n EmployeesComponent,\n DepartmentsComponent,\n PositionsComponent,\n GradesComponent,\n ],\n imports: [\n HRRoutingModule,\n CommonModule,\n SpaAdminModule\n ]\n})\nexport class HRModule { }\n"],"names":["i1.PageComponent"],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ import { HttpContextToken } from '@angular/common/http';
2
+ import * as i0 from '@angular/core';
3
+ import { Injectable } from '@angular/core';
4
+
5
+ // Added (landing-first L2, arbiter ruling 2026-09-01): the ROOT HttpClient slot that the lazy primary fills.
6
+ //
7
+ // 🔴 WHY THIS FILE EXISTS — it fixes a MEASURED 401 STORM, not a cosmetic defect.
8
+ //
9
+ // Dropping TinSpaModule from an app's ROOT module is what takes the ~2.9MB tin-spa primary out of an
10
+ // anonymous visitor's download. But TinSpaModule was also registering
11
+ // { provide: HTTP_INTERCEPTORS, useClass: LoaderInterceptor, multi: true }
12
+ // and LoaderInterceptor.addToken is the SOLE bearer-token attachment point in the estate. Moving those
13
+ // providers onto the LAZY shell route did not move that registration into the root chain — an interceptor
14
+ // registered by a lazy route NEVER joins it. Measured consequence on shift-spa: 33 x 401 after a real
15
+ // login, with NO Authorization header on the wire, while the same token via curl returned 200.
16
+ // The app was unusable after login. "The global loading bar does not run" was a symptom of this, not
17
+ // the consequence of it.
18
+ //
19
+ // 🔑 THE SHAPE IS FORCED, and it was ruled on rather than chosen. Angular DI cannot express
20
+ // "root-position provider whose implementation is supplied later by a CHILD environment injector":
21
+ // * Moving LoaderInterceptor into a dependency-free entry point is impossible — it injects nine
22
+ // services (AuthService, MessageService, LoaderService, Router, LogService, StorageService,
23
+ // OfflineService, ApiErrorService) plus Constants. That set IS the primary; such an entry point
24
+ // would be the primary wearing a hat, and importing it eagerly reclaims the whole bundle.
25
+ // * A root FUNCTIONAL interceptor cannot see the lazy route injector that owns the instance, and
26
+ // consumer roots use HttpClientModule, which honours HTTP_INTERCEPTORS but ignores
27
+ // withInterceptors(). Going functional would force a provideHttpClient migration in five apps.
28
+ // So: the root chain permanently holds ONE slot that injects nothing, and the primary fills it the
29
+ // moment the lazy shell route's environment injector is created.
30
+ //
31
+ // ⏱️ THE TIMING IS SAFE, and this was verified against Angular's shipped runtime rather than assumed.
32
+ // In @angular/router/fesm2022/router2.mjs, matchWithChecks() calls getOrCreateRouteInjectorIfNeeded()
33
+ // (:3847) BEFORE runCanMatchGuards() (:3848), and that function (:1887-1891) is what calls
34
+ // createEnvironmentInjector(route.providers, ...). The route's providers — and therefore the
35
+ // ENVIRONMENT_INITIALIZER that fills this delegate — are live during the RECOGNITION phase: before
36
+ // canMatch, before canActivateChild, and before any component. No guard can race a tokenless request out.
37
+ // Added: set by whichever interceptor does the real work, so a request can never be processed twice.
38
+ // This is the double-interception guard. An app that (wrongly) has BOTH TinSpaModule at root AND this
39
+ // shim registered would otherwise run LoaderInterceptor twice per request — double loader bookkeeping and
40
+ // two 401-refresh attempts. Defaults false, is set only by the real interceptor, and is never cleared.
41
+ const TIN_LOADER_RAN = new HttpContextToken(() => false);
42
+ // Added: the delegate slot. Module-scoped and mutable BY NECESSITY — see the DI note above.
43
+ // Write-once from library code. There is deliberately NO reset/clear path: clearing it mid-session would
44
+ // reopen the untokenised window on the auth path (arbiter assumption 3).
45
+ let delegate = null;
46
+ // Added: called by TIN_SPA_MODULE_PROVIDERS' ENVIRONMENT_INITIALIZER when the lazy primary loads.
47
+ // NOT re-exported from the primary barrel — consumer apps have no reason to call it.
48
+ function setTinHttpDelegate(interceptor) {
49
+ if (delegate) {
50
+ return;
51
+ } // Write-once: the first primary to load owns the slot
52
+ delegate = interceptor;
53
+ }
54
+ let fallbackAttacher = null;
55
+ function setTinFallbackTokenAttacher(attacher) {
56
+ if (fallbackAttacher) {
57
+ return;
58
+ } // Write-once: deliberately no reset/clear path
59
+ fallbackAttacher = attacher;
60
+ }
61
+ class TinRootInterceptor {
62
+ // Injects NOTHING. That is the entire point — it is the only thing that lets this class sit in the
63
+ // eager root chain of an app that no longer references the tin-spa primary.
64
+ intercept(request, next) {
65
+ // Added (token-slot A-0901-17): the DELEGATE IS CHECKED FIRST and its branch is unchanged. Once the
66
+ // primary has loaded there is exactly one code path, byte-for-byte the one that shipped in 20.14.110.
67
+ if (delegate) {
68
+ return delegate.intercept(request, next);
69
+ }
70
+ // Added (token-slot A-0901-17): the primary is not here yet, but the login tier has supplied a
71
+ // minimal attacher — see TIN_LOGIN_TIER_HTTP_PROVIDERS in tin-spa/core. The request goes out WITH a
72
+ // bearer token instead of tokenless.
73
+ //
74
+ // DELIBERATELY console.info, NOT console.warn. The warn below is a RACE DETECTOR for a genuinely
75
+ // untokenised request; this case is the handled one, and the two must stay distinguishable — both by
76
+ // a reader and by the gate that counts untokenised warnings. Do not "tidy" these into one call.
77
+ //
78
+ // TIN_LOADER_RAN IS NOT SET HERE, on purpose. That marker means "the real interceptor has already
79
+ // done its work". The attacher does not do that work — it only adds a header. Setting it would make
80
+ // a later LoaderInterceptor step aside for a request it never actually processed.
81
+ if (fallbackAttacher) {
82
+ console.info(`[tin-spa] HTTP request issued before the tin-spa primary loaded — token attached by the login-tier fallback: ${request.method} ${request.url}`);
83
+ return next.handle(fallbackAttacher(request));
84
+ }
85
+ // Added: FAIL-OPEN before the primary has loaded, ruled deliberately (arbiter, 2026-09-01).
86
+ // Fail-CLOSED is the instinctive "secure" answer and it is wrong here: it would block the LOGIN POST
87
+ // itself — the one request that must go out anonymously, and the one that creates the token the
88
+ // delegate needs. The risk of passing through is a TOKENLESS request, which fails 401 loudly at the
89
+ // server; the risk of blocking is a broken login that the server never even sees. 401 is the better
90
+ // failure. The warn is UNTHROTTLED on purpose: it is a race detector, and suppressing it defeats it.
91
+ // Note (A-0901-17): once an app installs the fallback attacher, this branch is reached ONLY by apps
92
+ // that have not opted into the login tier. The login POST of an opted-in app takes the attacher
93
+ // branch above and is returned UNCHANGED there (no token exists yet), so it still goes out
94
+ // anonymously — the fail-open guarantee is preserved by the attacher, not by this branch.
95
+ console.warn(`[tin-spa] HTTP request issued before the tin-spa primary loaded — sent WITHOUT an Authorization header: ${request.method} ${request.url}`);
96
+ return next.handle(request);
97
+ }
98
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: TinRootInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
99
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: TinRootInterceptor }); }
100
+ }
101
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: TinRootInterceptor, decorators: [{
102
+ type: Injectable
103
+ }] });
104
+
105
+ // tin-spa/http — the ROOT HttpClient slot, and NOTHING else.
106
+ //
107
+ // It imports only @angular/core and @angular/common/http. It must NEVER import from the tin-spa
108
+ // PRIMARY (not a value, not a type, not a re-export): a static reference from here would reclaim the
109
+ // ~2.9MB primary into the eager anonymous bundle and undo the entire landing-first initiative. That is
110
+ // the same law that keeps tin-spa/keys dependency-free.
111
+
112
+ /**
113
+ * Generated bundle index. Do not edit.
114
+ */
115
+
116
+ export { TIN_LOADER_RAN, TinRootInterceptor, setTinFallbackTokenAttacher, setTinHttpDelegate };
117
+ //# sourceMappingURL=tin-spa-http.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tin-spa-http.mjs","sources":["../../../projects/tin-spa/http/src/lib/root-interceptor.ts","../../../projects/tin-spa/http/src/public-api.ts","../../../projects/tin-spa/http/src/tin-spa-http.ts"],"sourcesContent":["// Added (landing-first L2, arbiter ruling 2026-09-01): the ROOT HttpClient slot that the lazy primary fills.\n//\n// 🔴 WHY THIS FILE EXISTS — it fixes a MEASURED 401 STORM, not a cosmetic defect.\n//\n// Dropping TinSpaModule from an app's ROOT module is what takes the ~2.9MB tin-spa primary out of an\n// anonymous visitor's download. But TinSpaModule was also registering\n// { provide: HTTP_INTERCEPTORS, useClass: LoaderInterceptor, multi: true }\n// and LoaderInterceptor.addToken is the SOLE bearer-token attachment point in the estate. Moving those\n// providers onto the LAZY shell route did not move that registration into the root chain — an interceptor\n// registered by a lazy route NEVER joins it. Measured consequence on shift-spa: 33 x 401 after a real\n// login, with NO Authorization header on the wire, while the same token via curl returned 200.\n// The app was unusable after login. \"The global loading bar does not run\" was a symptom of this, not\n// the consequence of it.\n//\n// 🔑 THE SHAPE IS FORCED, and it was ruled on rather than chosen. Angular DI cannot express\n// \"root-position provider whose implementation is supplied later by a CHILD environment injector\":\n// * Moving LoaderInterceptor into a dependency-free entry point is impossible — it injects nine\n// services (AuthService, MessageService, LoaderService, Router, LogService, StorageService,\n// OfflineService, ApiErrorService) plus Constants. That set IS the primary; such an entry point\n// would be the primary wearing a hat, and importing it eagerly reclaims the whole bundle.\n// * A root FUNCTIONAL interceptor cannot see the lazy route injector that owns the instance, and\n// consumer roots use HttpClientModule, which honours HTTP_INTERCEPTORS but ignores\n// withInterceptors(). Going functional would force a provideHttpClient migration in five apps.\n// So: the root chain permanently holds ONE slot that injects nothing, and the primary fills it the\n// moment the lazy shell route's environment injector is created.\n//\n// ⏱️ THE TIMING IS SAFE, and this was verified against Angular's shipped runtime rather than assumed.\n// In @angular/router/fesm2022/router2.mjs, matchWithChecks() calls getOrCreateRouteInjectorIfNeeded()\n// (:3847) BEFORE runCanMatchGuards() (:3848), and that function (:1887-1891) is what calls\n// createEnvironmentInjector(route.providers, ...). The route's providers — and therefore the\n// ENVIRONMENT_INITIALIZER that fills this delegate — are live during the RECOGNITION phase: before\n// canMatch, before canActivateChild, and before any component. No guard can race a tokenless request out.\nimport { HttpContextToken, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\n\n// Added: set by whichever interceptor does the real work, so a request can never be processed twice.\n// This is the double-interception guard. An app that (wrongly) has BOTH TinSpaModule at root AND this\n// shim registered would otherwise run LoaderInterceptor twice per request — double loader bookkeeping and\n// two 401-refresh attempts. Defaults false, is set only by the real interceptor, and is never cleared.\nexport const TIN_LOADER_RAN = new HttpContextToken<boolean>(() => false);\n\n// Added: the delegate slot. Module-scoped and mutable BY NECESSITY — see the DI note above.\n// Write-once from library code. There is deliberately NO reset/clear path: clearing it mid-session would\n// reopen the untokenised window on the auth path (arbiter assumption 3).\nlet delegate: HttpInterceptor | null = null;\n\n// Added: called by TIN_SPA_MODULE_PROVIDERS' ENVIRONMENT_INITIALIZER when the lazy primary loads.\n// NOT re-exported from the primary barrel — consumer apps have no reason to call it.\nexport function setTinHttpDelegate(interceptor: HttpInterceptor): void {\n if (delegate) { return; } // Write-once: the first primary to load owns the slot\n delegate = interceptor;\n}\n\n// Added (token-slot, arbiter ruling A-0901-17): the FALLBACK token attacher.\n//\n// 🔗 MAINTENANCE SEAM — this slot is one half of a pair. The other half is\n// TIN_LOGIN_TIER_HTTP_PROVIDERS in `tin-spa/core` (core/src/lib/runtime/login-tier-http.ts), which is\n// the ONLY thing in the estate that fills this slot. Read that file before changing this one.\n//\n// 🔑 THE LAW OF THE PAIR, in three lines:\n// 1. THE DELEGATE ALWAYS WINS. The moment the primary loads, this attacher is never consulted again.\n// 2. THE FALLBACK ONLY ATTACHES. It adds an Authorization header and nothing else — no loading bar,\n// no 401 refresh, no error dialog, no offline suppression. It is not a small LoaderInterceptor\n// and must never grow into one.\n// 3. THE CORRECT FIX FOR ANYTHING MORE IS TO LOAD THE PRIMARY. If a route needs real interceptor\n// behaviour, give it the primary; do not enrich this slot.\n//\n// WHY IT EXISTS: the login tier deliberately does not reference the primary, so between a successful\n// login POST and the shell route's injector coming up, library code issues ~5 authenticated GETs while\n// `delegate` is still null. Measured on shift-spa: 6 untokenised warnings and 5 x 401 on every login.\n// The page recovered and looked perfect, which is what made it dangerous.\n//\n// Same write-once law as the delegate, and for the same reason: a reset path would reopen the\n// untokenised window on the auth path mid-session.\nexport type TinTokenAttacher = (req: HttpRequest<any>) => HttpRequest<any>;\n\nlet fallbackAttacher: TinTokenAttacher | null = null;\n\nexport function setTinFallbackTokenAttacher(attacher: TinTokenAttacher): void {\n if (fallbackAttacher) { return; } // Write-once: deliberately no reset/clear path\n fallbackAttacher = attacher;\n}\n\n@Injectable()\nexport class TinRootInterceptor implements HttpInterceptor {\n\n // Injects NOTHING. That is the entire point — it is the only thing that lets this class sit in the\n // eager root chain of an app that no longer references the tin-spa primary.\n\n intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n\n // Added (token-slot A-0901-17): the DELEGATE IS CHECKED FIRST and its branch is unchanged. Once the\n // primary has loaded there is exactly one code path, byte-for-byte the one that shipped in 20.14.110.\n if (delegate) {\n return delegate.intercept(request, next);\n }\n\n // Added (token-slot A-0901-17): the primary is not here yet, but the login tier has supplied a\n // minimal attacher — see TIN_LOGIN_TIER_HTTP_PROVIDERS in tin-spa/core. The request goes out WITH a\n // bearer token instead of tokenless.\n //\n // DELIBERATELY console.info, NOT console.warn. The warn below is a RACE DETECTOR for a genuinely\n // untokenised request; this case is the handled one, and the two must stay distinguishable — both by\n // a reader and by the gate that counts untokenised warnings. Do not \"tidy\" these into one call.\n //\n // TIN_LOADER_RAN IS NOT SET HERE, on purpose. That marker means \"the real interceptor has already\n // done its work\". The attacher does not do that work — it only adds a header. Setting it would make\n // a later LoaderInterceptor step aside for a request it never actually processed.\n if (fallbackAttacher) {\n console.info(`[tin-spa] HTTP request issued before the tin-spa primary loaded — token attached by the login-tier fallback: ${request.method} ${request.url}`);\n return next.handle(fallbackAttacher(request));\n }\n\n // Added: FAIL-OPEN before the primary has loaded, ruled deliberately (arbiter, 2026-09-01).\n // Fail-CLOSED is the instinctive \"secure\" answer and it is wrong here: it would block the LOGIN POST\n // itself — the one request that must go out anonymously, and the one that creates the token the\n // delegate needs. The risk of passing through is a TOKENLESS request, which fails 401 loudly at the\n // server; the risk of blocking is a broken login that the server never even sees. 401 is the better\n // failure. The warn is UNTHROTTLED on purpose: it is a race detector, and suppressing it defeats it.\n // Note (A-0901-17): once an app installs the fallback attacher, this branch is reached ONLY by apps\n // that have not opted into the login tier. The login POST of an opted-in app takes the attacher\n // branch above and is returned UNCHANGED there (no token exists yet), so it still goes out\n // anonymously — the fail-open guarantee is preserved by the attacher, not by this branch.\n console.warn(`[tin-spa] HTTP request issued before the tin-spa primary loaded — sent WITHOUT an Authorization header: ${request.method} ${request.url}`);\n return next.handle(request);\n }\n}\n","// tin-spa/http — the ROOT HttpClient slot, and NOTHING else.\n//\n// It imports only @angular/core and @angular/common/http. It must NEVER import from the tin-spa\n// PRIMARY (not a value, not a type, not a re-export): a static reference from here would reclaim the\n// ~2.9MB primary into the eager anonymous bundle and undo the entire landing-first initiative. That is\n// the same law that keeps tin-spa/keys dependency-free.\nexport * from './lib/root-interceptor';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAKA;AACA;AACA;AACA;AACO,MAAM,cAAc,GAAG,IAAI,gBAAgB,CAAU,MAAM,KAAK;AAEvE;AACA;AACA;AACA,IAAI,QAAQ,GAA2B,IAAI;AAE3C;AACA;AACM,SAAU,kBAAkB,CAAC,WAA4B,EAAA;IAC7D,IAAI,QAAQ,EAAE;QAAE;AAAQ,IAAA,CAAC;IACzB,QAAQ,GAAG,WAAW;AACxB;AAyBA,IAAI,gBAAgB,GAA4B,IAAI;AAE9C,SAAU,2BAA2B,CAAC,QAA0B,EAAA;IACpE,IAAI,gBAAgB,EAAE;QAAE;AAAQ,IAAA,CAAC;IACjC,gBAAgB,GAAG,QAAQ;AAC7B;MAGa,kBAAkB,CAAA;;;IAK7B,SAAS,CAAC,OAAyB,EAAE,IAAiB,EAAA;;;QAIpD,IAAI,QAAQ,EAAE;YACZ,OAAO,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC;QAC1C;;;;;;;;;;;;QAaA,IAAI,gBAAgB,EAAE;AACpB,YAAA,OAAO,CAAC,IAAI,CAAC,CAAA,6GAAA,EAAgH,OAAO,CAAC,MAAM,CAAA,CAAA,EAAI,OAAO,CAAC,GAAG,CAAA,CAAE,CAAC;YAC7J,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC/C;;;;;;;;;;;AAYA,QAAA,OAAO,CAAC,IAAI,CAAC,CAAA,wGAAA,EAA2G,OAAO,CAAC,MAAM,CAAA,CAAA,EAAI,OAAO,CAAC,GAAG,CAAA,CAAE,CAAC;AACxJ,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7B;+GAzCW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAAlB,kBAAkB,EAAA,CAAA,CAAA;;4FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B;;;ACpFD;AACA;AACA;AACA;AACA;AACA;;ACLA;;AAEG;;;;"}