@ni/nimble-components 35.2.0 → 35.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/all-components-bundle.js +167 -109
- package/dist/all-components-bundle.js.map +1 -1
- package/dist/all-components-bundle.min.js +154 -89
- package/dist/all-components-bundle.min.js.map +1 -1
- package/dist/esm/anchor/template.js +4 -4
- package/dist/esm/anchor/template.js.map +1 -1
- package/dist/esm/anchor-tabs/index.js +2 -0
- package/dist/esm/anchor-tabs/index.js.map +1 -1
- package/dist/esm/checkbox/template.js +3 -3
- package/dist/esm/checkbox/template.js.map +1 -1
- package/dist/esm/chip/testing/chip.pageobject.js +1 -1
- package/dist/esm/chip/testing/chip.pageobject.js.map +1 -1
- package/dist/esm/combobox/index.js +11 -11
- package/dist/esm/combobox/index.js.map +1 -1
- package/dist/esm/combobox/template.js +1 -1
- package/dist/esm/combobox/template.js.map +1 -1
- package/dist/esm/dialog/index.js +1 -1
- package/dist/esm/dialog/index.js.map +1 -1
- package/dist/esm/menu/menu.foundation.js +3 -3
- package/dist/esm/menu/menu.foundation.js.map +1 -1
- package/dist/esm/menu-button/index.js +2 -2
- package/dist/esm/menu-button/index.js.map +1 -1
- package/dist/esm/number-field/template.js +3 -3
- package/dist/esm/number-field/template.js.map +1 -1
- package/dist/esm/rich-text/editor/index.js +1 -1
- package/dist/esm/rich-text/editor/index.js.map +1 -1
- package/dist/esm/rich-text/editor/models/create-tiptap-editor.js +1 -1
- package/dist/esm/rich-text/editor/models/create-tiptap-editor.js.map +1 -1
- package/dist/esm/rich-text/editor/testing/rich-text-editor.pageobject.js +1 -3
- package/dist/esm/rich-text/editor/testing/rich-text-editor.pageobject.js.map +1 -1
- package/dist/esm/rich-text/mention-listbox/index.d.ts +1 -1
- package/dist/esm/rich-text/mention-listbox/index.js +3 -3
- package/dist/esm/rich-text/mention-listbox/index.js.map +1 -1
- package/dist/esm/rich-text/models/markdown-serializer.js +1 -1
- package/dist/esm/rich-text/models/markdown-serializer.js.map +1 -1
- package/dist/esm/rich-text/models/rich-text-validator.js +1 -1
- package/dist/esm/rich-text/models/rich-text-validator.js.map +1 -1
- package/dist/esm/select/index.js +11 -15
- package/dist/esm/select/index.js.map +1 -1
- package/dist/esm/select/template.js +1 -1
- package/dist/esm/select/template.js.map +1 -1
- package/dist/esm/switch/styles.js +101 -36
- package/dist/esm/switch/styles.js.map +1 -1
- package/dist/esm/switch/template.js +1 -1
- package/dist/esm/switch/template.js.map +1 -1
- package/dist/esm/table/index.js +1 -1
- package/dist/esm/table/index.js.map +1 -1
- package/dist/esm/table/models/array-to-tree.js +6 -10
- package/dist/esm/table/models/array-to-tree.js.map +1 -1
- package/dist/esm/table/models/keyboard-navigation-manager.js.map +1 -1
- package/dist/esm/table/models/selection-managers/selection-manager-base.js +1 -1
- package/dist/esm/table/models/selection-managers/selection-manager-base.js.map +1 -1
- package/dist/esm/table/models/table-layout-manager.js +1 -1
- package/dist/esm/table/models/table-layout-manager.js.map +1 -1
- package/dist/esm/table/models/table-validator.js +1 -1
- package/dist/esm/table/models/table-validator.js.map +1 -1
- package/dist/esm/table-column/duration-text/models/duration-formatter.js +2 -2
- package/dist/esm/table-column/duration-text/models/duration-formatter.js.map +1 -1
- package/dist/esm/text-area/template.js +1 -1
- package/dist/esm/text-area/template.js.map +1 -1
- package/dist/esm/text-field/template.js +1 -1
- package/dist/esm/text-field/template.js.map +1 -1
- package/dist/esm/utilities/models/tracker.js.map +1 -1
- package/dist/esm/wafer-map/experimental/worker-renderer.js +1 -2
- package/dist/esm/wafer-map/experimental/worker-renderer.js.map +1 -1
- package/dist/esm/wafer-map/modules/rendering.js +1 -1
- package/dist/esm/wafer-map/modules/rendering.js.map +1 -1
- package/dist/esm/wafer-map/modules/wafer-map-validator.js +1 -1
- package/dist/esm/wafer-map/modules/wafer-map-validator.js.map +1 -1
- package/dist/esm/wafer-map/workers/worker-code.d.ts +1 -1
- package/dist/esm/wafer-map/workers/worker-code.js +1 -1
- package/dist/esm/wafer-map/workers/worker-code.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-validator.js","sourceRoot":"","sources":["../../../../src/table/models/table-validator.ts"],"names":[],"mappings":"AACA,OAAO,EAEH,qBAAqB,EAGxB,MAAM,UAAU,CAAC;AAElB;;;GAGG;AACH,MAAM,OAAO,cAAc;IAA3B;QACY,sBAAiB,GAAG,KAAK,CAAC;QAC1B,oBAAe,GAAG,KAAK,CAAC;QACxB,oBAAe,GAAG,KAAK,CAAC;QACxB,sBAAiB,GAAG,KAAK,CAAC;QAC1B,oBAAe,GAAG,KAAK,CAAC;QACxB,uBAAkB,GAAG,KAAK,CAAC;QAC3B,wBAAmB,GAAG,KAAK,CAAC;QAC5B,6BAAwB,GAAG,KAAK,CAAC;QACjC,+BAA0B,GAAG,KAAK,CAAC;QACnC,iCAA4B,GAAG,KAAK,CAAC;QAE5B,cAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAyJnD,CAAC;IAvJU,WAAW;QACd,OAAO;YACH,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,wBAAwB,EAAE,IAAI,CAAC,wBAAwB;YACvD,0BAA0B,EAAE,IAAI,CAAC,0BAA0B;YAC3D,4BAA4B,EAAE,IAAI,CAAC,4BAA4B;SAClE,CAAC;IACN,CAAC;IAEM,OAAO;QACV,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"table-validator.js","sourceRoot":"","sources":["../../../../src/table/models/table-validator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TableColumn } from '../../table-column/base';\nimport {\n type TableRecord,\n TableRowSelectionMode,\n type TableSetRecordHierarchyOptions,\n type TableValidity\n} from '../types';\n\n/**\n * Helper class for the nimble-table to validate that the table's configuration\n * is valid and report which aspects of the configuration are valid or invalid.\n */\nexport class TableValidator<TData extends TableRecord> {\n private duplicateRecordId = false;\n private missingRecordId = false;\n private invalidRecordId = false;\n private duplicateColumnId = false;\n private missingColumnId = false;\n private duplicateSortIndex = false;\n private duplicateGroupIndex = false;\n private idFieldNameNotConfigured = false;\n private invalidColumnConfiguration = false;\n private invalidParentIdConfiguration = false;\n\n private readonly recordIds = new Set<string>();\n\n public getValidity(): TableValidity {\n return {\n duplicateRecordId: this.duplicateRecordId,\n missingRecordId: this.missingRecordId,\n invalidRecordId: this.invalidRecordId,\n duplicateColumnId: this.duplicateColumnId,\n missingColumnId: this.missingColumnId,\n duplicateSortIndex: this.duplicateSortIndex,\n duplicateGroupIndex: this.duplicateGroupIndex,\n idFieldNameNotConfigured: this.idFieldNameNotConfigured,\n invalidColumnConfiguration: this.invalidColumnConfiguration,\n invalidParentIdConfiguration: this.invalidParentIdConfiguration\n };\n }\n\n public isValid(): boolean {\n return Object.values(this.getValidity()).every(x => !x);\n }\n\n public areRecordIdsValid(): boolean {\n const validity = this.getValidity();\n return (\n !validity.duplicateRecordId\n && !validity.missingRecordId\n && !validity.invalidRecordId\n );\n }\n\n public validateIdFieldConfiguration(\n selectionMode: TableRowSelectionMode,\n idFieldName: string | undefined,\n parentIdFieldName: string | undefined\n ): boolean {\n const idFieldNameRequired = selectionMode !== TableRowSelectionMode.none\n || typeof parentIdFieldName === 'string';\n if (idFieldNameRequired) {\n this.idFieldNameNotConfigured = typeof idFieldName !== 'string';\n } else {\n this.idFieldNameNotConfigured = false;\n }\n return !this.idFieldNameNotConfigured;\n }\n\n public validateRecordIds(\n data: readonly TData[],\n idFieldName: string | undefined\n ): boolean {\n // Start off by assuming all IDs are valid.\n this.duplicateRecordId = false;\n this.missingRecordId = false;\n this.invalidRecordId = false;\n this.recordIds.clear();\n\n if (typeof idFieldName !== 'string') {\n return true;\n }\n\n for (const record of data) {\n if (!Object.prototype.hasOwnProperty.call(record, idFieldName)) {\n this.missingRecordId = true;\n continue;\n }\n\n const id = record[idFieldName];\n if (typeof id !== 'string') {\n this.invalidRecordId = true;\n continue;\n }\n\n if (this.recordIds.has(id)) {\n this.duplicateRecordId = true;\n }\n this.recordIds.add(id);\n }\n\n return (\n !this.missingRecordId\n && !this.invalidRecordId\n && !this.duplicateRecordId\n );\n }\n\n public validateColumnIds(\n columnIds: readonly (string | undefined)[]\n ): boolean {\n this.missingColumnId = false;\n this.duplicateColumnId = false;\n\n const anyColumnsHaveIds = columnIds.some(id => id);\n\n if (!anyColumnsHaveIds) {\n return true;\n }\n\n const idSet = new Set<string>();\n for (const columnId of columnIds) {\n if (!columnId) {\n this.missingColumnId = true;\n continue;\n }\n\n if (idSet.has(columnId)) {\n this.duplicateColumnId = true;\n }\n idSet.add(columnId);\n }\n\n return !this.missingColumnId && !this.duplicateColumnId;\n }\n\n public validateColumnSortIndices(sortIndices: readonly number[]): boolean {\n this.duplicateSortIndex = !this.validateIndicesAreUnique(sortIndices);\n return !this.duplicateSortIndex;\n }\n\n public validateColumnGroupIndices(\n groupIndices: readonly number[]\n ): boolean {\n this.duplicateGroupIndex = !this.validateIndicesAreUnique(groupIndices);\n return !this.duplicateGroupIndex;\n }\n\n public validateColumnConfigurations(\n columns: readonly TableColumn[]\n ): boolean {\n this.invalidColumnConfiguration = columns.some(\n x => !x.columnInternals.validator.isColumnValid\n );\n return !this.invalidColumnConfiguration;\n }\n\n public getPresentRecordIds(\n requestedRecordIds: readonly string[]\n ): string[] {\n return requestedRecordIds.filter(id => this.recordIds.has(id));\n }\n\n public getOptionsWithPresentIds(\n requestedOptions: readonly TableSetRecordHierarchyOptions[]\n ): TableSetRecordHierarchyOptions[] {\n return requestedOptions.filter(item => this.recordIds.has(item.recordId));\n }\n\n public setParentIdConfigurationValidity(valid: boolean): void {\n this.invalidParentIdConfiguration = !valid;\n }\n\n private validateIndicesAreUnique(indices: readonly number[]): boolean {\n const numberSet = new Set<number>(indices);\n return numberSet.size === indices.length;\n }\n}\n"]}
|
|
@@ -53,13 +53,13 @@ export class DurationFormatter {
|
|
|
53
53
|
}
|
|
54
54
|
const hours = Math.floor((milliseconds / millisecondsPerHour) % 24);
|
|
55
55
|
remainingTime -= hours * millisecondsPerHour;
|
|
56
|
-
if (hours) {
|
|
56
|
+
if (hours !== 0) {
|
|
57
57
|
const formattedHours = this.hoursFormatter.format(hours);
|
|
58
58
|
result.push(formattedHours);
|
|
59
59
|
}
|
|
60
60
|
const minutes = Math.floor((milliseconds / millisecondsPerMinute) % 60);
|
|
61
61
|
remainingTime -= minutes * millisecondsPerMinute;
|
|
62
|
-
if (minutes) {
|
|
62
|
+
if (minutes !== 0) {
|
|
63
63
|
const formattedMinutes = this.minutesFormatter.format(minutes);
|
|
64
64
|
result.push(formattedMinutes);
|
|
65
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duration-formatter.js","sourceRoot":"","sources":["../../../../../src/table-column/duration-text/models/duration-formatter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IAO1B,YAAoC,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;QAC5C,IAAI,CAAC,aAAa,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE;YAClD,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,KAAK;SACd,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE;YACnD,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,MAAM;SACf,CAAC,CAAC;QACH,IAAI,CAAC,gBAAgB,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE;YACrD,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,QAAQ;SACjB,CAAC,CAAC;QACH,IAAI,CAAC,gBAAgB,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE;YACrD,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,QAAQ;SACjB,CAAC,CAAC;QACH,IAAI,CAAC,0BAA0B,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE;YAC/D,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,YAAY;YACtB,qBAAqB,EAAE,CAAC;SAC3B,CAAC,CAAC;IACP,CAAC;IAEM,MAAM,CAAC,YAAuC;QACjD,IACI,OAAO,YAAY,KAAK,QAAQ;eAC7B,YAAY,GAAG,CAAC;eAChB,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EACnC,CAAC;YACC,OAAO,EAAE,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,MAAM,qBAAqB,GAAG,IAAI,CAAC;QACnC,MAAM,qBAAqB,GAAG,qBAAqB,GAAG,EAAE,CAAC;QACzD,MAAM,mBAAmB,GAAG,qBAAqB,GAAG,EAAE,CAAC;QACvD,MAAM,kBAAkB,GAAG,mBAAmB,GAAG,EAAE,CAAC;QACpD,MAAM,cAAc,GAAG,YAAY,GAAG,kBAAkB,CAAC;QACzD,MAAM,WAAW,GAAG,GAAG,CAAC;QACxB,IAAI,aAAa,GAAG,YAAY,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACxC,IAAI,IAAI,IAAI,WAAW,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACtD,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC3B,aAAa,IAAI,IAAI,GAAG,kBAAkB,CAAC;QAC/C,CAAC;aAAM,IAAI,IAAI,GAAG,WAAW,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,0BAA0B,CAAC,MAAM,CACzC,YAAY,GAAG,qBAAqB,CACvC,CAAC;QACN,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,mBAAmB,CAAC,GAAG,EAAE,CAAC,CAAC;QACpE,aAAa,IAAI,KAAK,GAAG,mBAAmB,CAAC;QAC7C,IAAI,KAAK,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"duration-formatter.js","sourceRoot":"","sources":["../../../../../src/table-column/duration-text/models/duration-formatter.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * A class for formatting a numeric value in the unit of milliseconds into a display value representing its\n * days, hours, minutes, and seconds.\n */\nexport class DurationFormatter {\n private readonly daysFormatter: Intl.NumberFormat;\n private readonly hoursFormatter: Intl.NumberFormat;\n private readonly minutesFormatter: Intl.NumberFormat;\n private readonly secondsFormatter: Intl.NumberFormat;\n private readonly scientificSecondsFormatter: Intl.NumberFormat;\n\n public constructor(private readonly lang: string) {\n this.daysFormatter = new Intl.NumberFormat(this.lang, {\n style: 'unit',\n unit: 'day'\n });\n this.hoursFormatter = new Intl.NumberFormat(this.lang, {\n style: 'unit',\n unit: 'hour'\n });\n this.minutesFormatter = new Intl.NumberFormat(this.lang, {\n style: 'unit',\n unit: 'minute'\n });\n this.secondsFormatter = new Intl.NumberFormat(this.lang, {\n style: 'unit',\n unit: 'second'\n });\n this.scientificSecondsFormatter = new Intl.NumberFormat(this.lang, {\n style: 'unit',\n unit: 'second',\n notation: 'scientific',\n maximumFractionDigits: 3\n });\n }\n\n public format(milliseconds: number | null | undefined): string {\n if (\n typeof milliseconds !== 'number'\n || milliseconds < 0\n || !Number.isFinite(milliseconds)\n ) {\n return '';\n }\n\n const result = [];\n const millisecondsPerSecond = 1000;\n const millisecondsPerMinute = millisecondsPerSecond * 60;\n const millisecondsPerHour = millisecondsPerMinute * 60;\n const millisecondsPerDay = millisecondsPerHour * 24;\n const fractionalDays = milliseconds / millisecondsPerDay;\n const maximumDays = 999;\n let remainingTime = milliseconds;\n const days = Math.floor(fractionalDays);\n if (days <= maximumDays && days > 0) {\n const formattedDays = this.daysFormatter.format(days);\n result.push(formattedDays);\n remainingTime -= days * millisecondsPerDay;\n } else if (days > maximumDays) {\n return this.scientificSecondsFormatter.format(\n milliseconds / millisecondsPerSecond\n );\n }\n\n const hours = Math.floor((milliseconds / millisecondsPerHour) % 24);\n remainingTime -= hours * millisecondsPerHour;\n if (hours !== 0) {\n const formattedHours = this.hoursFormatter.format(hours);\n result.push(formattedHours);\n }\n\n const minutes = Math.floor((milliseconds / millisecondsPerMinute) % 60);\n remainingTime -= minutes * millisecondsPerMinute;\n if (minutes !== 0) {\n const formattedMinutes = this.minutesFormatter.format(minutes);\n result.push(formattedMinutes);\n }\n\n const valueInSeconds = remainingTime / millisecondsPerSecond;\n // if -0, coerce to 0\n const seconds = valueInSeconds === 0 ? 0 : valueInSeconds % 60;\n if (milliseconds < 1 && valueInSeconds !== 0) {\n return this.scientificSecondsFormatter.format(valueInSeconds);\n }\n\n if (seconds >= 0.0005 || (seconds === 0 && result.length === 0)) {\n const formattedSeconds = this.secondsFormatter.format(seconds);\n result.push(formattedSeconds);\n }\n\n return result.join(', ');\n }\n}\n"]}
|
|
@@ -6,7 +6,7 @@ const labelTemplate = createRequiredVisibleLabelTemplate(html `
|
|
|
6
6
|
<label
|
|
7
7
|
part="label"
|
|
8
8
|
for="control"
|
|
9
|
-
class="${x => (x.defaultSlottedNodes?.length ? 'label' : 'label label__hidden')}"
|
|
9
|
+
class="${x => (x.defaultSlottedNodes?.length > 0 ? 'label' : 'label label__hidden')}"
|
|
10
10
|
>
|
|
11
11
|
<slot ${slotted('defaultSlottedNodes')}></slot>
|
|
12
12
|
</label>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/text-area/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,kCAAkC,EAAE,MAAM,uCAAuC,CAAC;AAE3F,MAAM,aAAa,GAAG,kCAAkC,CAAC,IAAI,CAAU;;;;iBAItD,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;;
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/text-area/template.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, ref, slotted, ViewTemplate } from '@ni/fast-element';\nimport type { FoundationElementTemplate } from '@ni/fast-foundation';\nimport type { TextArea } from '.';\nimport { iconExclamationMarkTag } from '../icons/exclamation-mark';\nimport { errorTextTemplate } from '../patterns/error/template';\nimport { createRequiredVisibleLabelTemplate } from '../patterns/required-visible/template';\n\nconst labelTemplate = createRequiredVisibleLabelTemplate(html<TextArea>`\n <label\n part=\"label\"\n for=\"control\"\n class=\"${x => (x.defaultSlottedNodes?.length > 0 ? 'label' : 'label label__hidden')}\"\n >\n <slot ${slotted('defaultSlottedNodes')}></slot>\n </label>\n`);\n\nexport const template: FoundationElementTemplate<\nViewTemplate<TextArea>\n> = () => html<TextArea>`\n ${labelTemplate}\n <div class=\"container\">\n <textarea\n part=\"control\"\n class=\"control\"\n id=\"control\"\n ?autofocus=\"${x => x.autofocus}\"\n cols=\"${x => x.cols}\"\n ?disabled=\"${x => x.disabled}\"\n form=\"${x => x.form}\"\n list=\"${x => x.list}\"\n maxlength=\"${x => x.maxlength}\"\n minlength=\"${x => x.minlength}\"\n name=\"${x => x.name}\"\n placeholder=\"${x => x.placeholder}\"\n ?readonly=\"${x => x.readOnly}\"\n ?required=\"${x => x.required}\"\n rows=\"${x => x.rows}\"\n ?spellcheck=\"${x => x.spellcheck}\"\n :value=\"${x => x.value}\"\n aria-atomic=\"${x => x.ariaAtomic}\"\n aria-busy=\"${x => x.ariaBusy}\"\n aria-controls=\"${x => x.ariaControls}\"\n aria-current=\"${x => x.ariaCurrent}\"\n aria-describedby=\"${x => x.ariaDescribedby}\"\n aria-details=\"${x => x.ariaDetails}\"\n aria-disabled=\"${x => x.ariaDisabled}\"\n aria-errormessage=\"${x => x.ariaErrormessage}\"\n aria-flowto=\"${x => x.ariaFlowto}\"\n aria-haspopup=\"${x => x.ariaHaspopup}\"\n aria-hidden=\"${x => x.ariaHidden}\"\n aria-invalid=\"${x => x.ariaInvalid}\"\n aria-keyshortcuts=\"${x => x.ariaKeyshortcuts}\"\n aria-label=\"${x => x.ariaLabel}\"\n aria-labelledby=\"${x => x.ariaLabelledby}\"\n aria-live=\"${x => x.ariaLive}\"\n aria-owns=\"${x => x.ariaOwns}\"\n aria-relevant=\"${x => x.ariaRelevant}\"\n aria-roledescription=\"${x => x.ariaRoledescription}\"\n aria-required=\"${x => x.requiredVisible}\"\n @input=\"${x => x.onTextAreaInput()}\"\n @change=\"${x => x.handleChange()}\"\n ${ref('control')}\n ></textarea>\n <${iconExclamationMarkTag}\n severity=\"error\"\n class=\"error-icon ${x => (x.scrollbarWidth >= 0 ? 'scrollbar-width-calculated' : '')}\"\n style=\"--ni-private-scrollbar-width: ${x => x.scrollbarWidth}px;\"\n ></${iconExclamationMarkTag}>\n ${errorTextTemplate}\n </div>\n`;\n"]}
|
|
@@ -4,7 +4,7 @@ import { createRequiredVisibleLabelTemplate } from '../patterns/required-visible
|
|
|
4
4
|
const labelTemplate = createRequiredVisibleLabelTemplate(html `<label
|
|
5
5
|
part="label"
|
|
6
6
|
for="control"
|
|
7
|
-
class="${x => (x.defaultSlottedNodes?.length ? 'label' : 'label label__hidden')}"
|
|
7
|
+
class="${x => (x.defaultSlottedNodes?.length > 0 ? 'label' : 'label label__hidden')}"
|
|
8
8
|
>
|
|
9
9
|
<slot
|
|
10
10
|
${slotted({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/text-field/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAGH,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EAClB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,kCAAkC,EAAE,MAAM,uCAAuC,CAAC;AAE3F,MAAM,aAAa,GAAG,kCAAkC,CACpD,IAAI,CAAW;;;iBAGF,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/text-field/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAGH,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EAClB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,kCAAkC,EAAE,MAAM,uCAAuC,CAAC;AAE3F,MAAM,aAAa,GAAG,kCAAkC,CACpD,IAAI,CAAW;;;iBAGF,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,mBAAmB,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;cAG7E,OAAO,CAAC;IACd,QAAQ,EAAE,qBAAqB;IAC/B,MAAM,EAAE,gBAAgB;CAC3B,CAAC;;aAEO,CACZ,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAGjB,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,IAAI,CAAA;;;cAGnB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;;;UAGvC,aAAa;;cAET,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC;;;;;0BAK1B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE;2BACvB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,EAAE;8BAClB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;6BACjB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;wBACpB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;6BACN,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;6BAChB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;2BAClB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO;+BACV,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW;6BACpB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;6BACf,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;wBACpB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;+BACJ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU;0BACtB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK;wBACd,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;+BACJ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU;6BACnB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;iCACX,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY;gCACpB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW;oCACd,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe;gCAC1B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW;iCACjB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY;qCACf,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB;+BAC7B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU;iCACf,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY;+BACrB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU;gCAChB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW;qCACb,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB;8BAC9B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;mCACX,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc;6BAC3B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;6BACf,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;iCACX,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY;wCACZ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB;iCACjC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe;kBACrC,GAAG,CAAC,SAAS,CAAC;;cAElB,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC;;;CAGjD,CAAC","sourcesContent":["import { html, ref, slotted } from '@ni/fast-element';\nimport type { ViewTemplate } from '@ni/fast-element';\nimport {\n type FoundationElementTemplate,\n type TextFieldOptions,\n whitespaceFilter,\n startSlotTemplate,\n endSlotTemplate\n} from '@ni/fast-foundation';\nimport type { TextField } from '.';\nimport { createRequiredVisibleLabelTemplate } from '../patterns/required-visible/template';\n\nconst labelTemplate = createRequiredVisibleLabelTemplate(\n html<TextField>`<label\n part=\"label\"\n for=\"control\"\n class=\"${x => (x.defaultSlottedNodes?.length > 0 ? 'label' : 'label label__hidden')}\"\n >\n <slot\n ${slotted({\n property: 'defaultSlottedNodes',\n filter: whitespaceFilter\n })}\n ></slot>\n </label>`\n);\n\n/**\n * The template for the {@link @ni/fast-foundation#(TextField:class)} component.\n * @public\n */\nexport const template: FoundationElementTemplate<\nViewTemplate<TextField>,\nTextFieldOptions\n> = (context, definition) => html`\n <template\n class=\"\n ${x => (x.readOnly ? 'readonly' : '')}\n \"\n >\n ${labelTemplate}\n <div class=\"root\" part=\"root\">\n ${startSlotTemplate(context, definition)}\n <input\n class=\"control\"\n part=\"control\"\n id=\"control\"\n @input=\"${x => x.handleTextInput()}\"\n @change=\"${x => x.handleChange()}\"\n ?autofocus=\"${x => x.autofocus}\"\n ?disabled=\"${x => x.disabled}\"\n list=\"${x => x.list}\"\n maxlength=\"${x => x.maxlength}\"\n minlength=\"${x => x.minlength}\"\n pattern=\"${x => x.pattern}\"\n placeholder=\"${x => x.placeholder}\"\n ?readonly=\"${x => x.readOnly}\"\n ?required=\"${x => x.required}\"\n size=\"${x => x.size}\"\n ?spellcheck=\"${x => x.spellcheck}\"\n :value=\"${x => x.value}\"\n type=\"${x => x.type}\"\n aria-atomic=\"${x => x.ariaAtomic}\"\n aria-busy=\"${x => x.ariaBusy}\"\n aria-controls=\"${x => x.ariaControls}\"\n aria-current=\"${x => x.ariaCurrent}\"\n aria-describedby=\"${x => x.ariaDescribedby}\"\n aria-details=\"${x => x.ariaDetails}\"\n aria-disabled=\"${x => x.ariaDisabled}\"\n aria-errormessage=\"${x => x.ariaErrormessage}\"\n aria-flowto=\"${x => x.ariaFlowto}\"\n aria-haspopup=\"${x => x.ariaHaspopup}\"\n aria-hidden=\"${x => x.ariaHidden}\"\n aria-invalid=\"${x => x.ariaInvalid}\"\n aria-keyshortcuts=\"${x => x.ariaKeyshortcuts}\"\n aria-label=\"${x => x.ariaLabel}\"\n aria-labelledby=\"${x => x.ariaLabelledby}\"\n aria-live=\"${x => x.ariaLive}\"\n aria-owns=\"${x => x.ariaOwns}\"\n aria-relevant=\"${x => x.ariaRelevant}\"\n aria-roledescription=\"${x => x.ariaRoledescription}\"\n aria-required=\"${x => x.requiredVisible}\"\n ${ref('control')}\n />\n ${endSlotTemplate(context, definition)}\n </div>\n </template>\n`;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../../../src/utilities/models/tracker.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,OAAO,OAAO;IAGhB,YAAmB,gBAAkC;QAEjD,IAAI,CAAC,YAAY,GAAG,EAAkB,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,gBAAgB,CAAC,MAAM,CACvC,CAAC,CAAC,EAAE,GAAG,EAAgB,EAAE;YACrB,OAAO;gBACH,GAAG,CAAC;gBACJ,CAAC,GAAG,CAAC,EAAE,KAAK;aACf,CAAC;QACN,CAAC,EACD,IAAI,CAAC,YAAY,CACpB,CAAC;IACN,CAAC;IAEM,eAAe;QAClB,OAAO,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;IACpC,CAAC;IAEM,SAAS,CAAC,GAA2C;QACxD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAEM,KAAK,CAAC,GAA2C;QACpD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YAC9B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;IAEM,OAAO,CAAC,GAA2C;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,UAAU,EAAE,CAAC;YACb,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC/B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;IAEM,QAAQ;QACX,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACpB,OAAO;QACX,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC5B,CAAC;IAEM,UAAU;QACb,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACrB,OAAO;QACX,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC5B,CAAC;IAEM,UAAU;QACb,OAAO,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../../../src/utilities/models/tracker.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,OAAO,OAAO;IAGhB,YAAmB,gBAAkC;QAEjD,IAAI,CAAC,YAAY,GAAG,EAAkB,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,gBAAgB,CAAC,MAAM,CACvC,CAAC,CAAC,EAAE,GAAG,EAAgB,EAAE;YACrB,OAAO;gBACH,GAAG,CAAC;gBACJ,CAAC,GAAG,CAAC,EAAE,KAAK;aACf,CAAC;QACN,CAAC,EACD,IAAI,CAAC,YAAY,CACpB,CAAC;IACN,CAAC;IAEM,eAAe;QAClB,OAAO,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;IACpC,CAAC;IAEM,SAAS,CAAC,GAA2C;QACxD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAEM,KAAK,CAAC,GAA2C;QACpD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YAC9B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;IAEM,OAAO,CAAC,GAA2C;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,UAAU,EAAE,CAAC;YACb,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC/B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;IAEM,QAAQ;QACX,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACpB,OAAO;QACX,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC5B,CAAC;IAEM,UAAU;QACb,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACrB,OAAO;QACX,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC5B,CAAC;IAEM,UAAU;QACb,OAAO,MAAM,CAAC,MAAM,CAAU,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IAEM,UAAU;QACb,OAAO,MAAM,CAAC,MAAM,CAAU,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;IAEM,WAAW;QACd,OAAO,MAAM,CAAC,MAAM,CAAU,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;IAEM,gBAAgB,KAAU,CAAC;IAE1B,UAAU,CAAC,KAAc;QAE7B,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CACrD,CAAC,CAAC,EAAE,GAAG,EAAgB,EAAE;YACrB,OAAO;gBACH,GAAG,CAAC;gBACJ,CAAC,GAAG,CAAC,EAAE,KAAK;aACf,CAAC;QACN,CAAC,EACD,IAAI,CAAC,YAAY,CACpB,CAAC;IACN,CAAC;CACJ","sourcesContent":["type ObjectFromList<T extends readonly string[]> = {\n [K in T extends readonly (infer U)[] ? U : never]: boolean;\n};\n\n/**\n * Generic Tracker which sets or resets provided flags\n */\nexport class Tracker<TrackedItemsList extends readonly string[]> {\n private trackedItems: ObjectFromList<TrackedItemsList>;\n\n public constructor(trackedItemsList: TrackedItemsList) {\n type TrackedItems = typeof this.trackedItems;\n this.trackedItems = {} as TrackedItems;\n this.trackedItems = trackedItemsList.reduce<TrackedItems>(\n (r, key): TrackedItems => {\n return {\n ...r,\n [key]: false\n };\n },\n this.trackedItems\n );\n }\n\n public getTrackedItems(): ObjectFromList<TrackedItemsList> {\n return { ...this.trackedItems };\n }\n\n public isTracked(key: keyof ObjectFromList<TrackedItemsList>): boolean {\n return this.trackedItems[key];\n }\n\n public track(key: keyof ObjectFromList<TrackedItemsList>): void {\n const wasTracked = this.trackedItems[key];\n if (!wasTracked) {\n this.trackedItems[key] = true;\n this.onTrackingChange();\n }\n }\n\n public untrack(key: keyof ObjectFromList<TrackedItemsList>): void {\n const wasTracked = this.trackedItems[key];\n if (wasTracked) {\n this.trackedItems[key] = false;\n this.onTrackingChange();\n }\n }\n\n public trackAll(): void {\n if (this.allTracked()) {\n return;\n }\n\n this.setAllKeys(true);\n this.onTrackingChange();\n }\n\n public untrackAll(): void {\n if (this.noneTracked()) {\n return;\n }\n\n this.setAllKeys(false);\n this.onTrackingChange();\n }\n\n public allTracked(): boolean {\n return Object.values<boolean>(this.trackedItems).every(x => x);\n }\n\n public anyTracked(): boolean {\n return Object.values<boolean>(this.trackedItems).some(x => x);\n }\n\n public noneTracked(): boolean {\n return Object.values<boolean>(this.trackedItems).every(x => !x);\n }\n\n public onTrackingChange(): void {}\n\n private setAllKeys(value: boolean): void {\n type TrackedItems = typeof this.trackedItems;\n this.trackedItems = Object.keys(this.trackedItems).reduce<TrackedItems>(\n (r, key): TrackedItems => {\n return {\n ...r,\n [key]: value\n };\n },\n this.trackedItems\n );\n }\n}\n"]}
|
|
@@ -39,10 +39,9 @@ export class WorkerRenderer {
|
|
|
39
39
|
});
|
|
40
40
|
await this.matrixRenderer.drawWafer();
|
|
41
41
|
if (!snapshot.dieLabelsHidden
|
|
42
|
-
&& snapshot.dieDimensions
|
|
43
42
|
&& snapshot.dieDimensions.width
|
|
44
43
|
* snapshot.dieDimensions.height
|
|
45
|
-
* (snapshot.transform.k
|
|
44
|
+
* (snapshot.transform.k !== 0 ? snapshot.transform.k : 1)
|
|
46
45
|
>= this.minDieDim) {
|
|
47
46
|
await this.matrixRenderer.drawText();
|
|
48
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-renderer.js","sourceRoot":"","sources":["../../../../src/wafer-map/experimental/worker-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGhD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAIzE;;GAEG;AACH,MAAM,OAAO,cAAc;IAOvB,YAAoC,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;QAFrC,cAAS,GAAG,GAAG,CAAC;IAEwB,CAAC;IAEnD,KAAK,CAAC,UAAU,CAAC,QAMvB;QACG,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAC;YACxD,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;YACrC,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,0BAA0B,EAAE,CAAC;YAChF,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAC/B,QAAQ,CAAC,eAAe,EAAE,CAAC,eAAe,CAAC,CAAC,CAC/C,CAAC;QACN,CAAC;QACD,MAAM,IAAI,CAAC,cAAc,CAAC,mBAAmB,CACzC,QAAQ,CAAC,gBAAgB,CAC5B,CAAC;QACF,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACjE,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CACnC,QAAQ,CAAC,aAAa,EACtB,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,MAAM,CAClB,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,QAKtB;QACG,MAAM,mBAAmB,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,uBAAuB,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC;YACtD,QAAQ,CAAC,gBAAgB,CAAC,KAAK;YAC/B,QAAQ,CAAC,gBAAgB,CAAC,MAAM;SACnC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC;YACzC,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,mBAAmB,EAAE;gBACjB,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK;gBACxD,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM;aAC5D;YACD,uBAAuB,EAAE;gBACrB,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC;gBAC7B,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC;aAChC;SACJ,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC;QACtC,IACI,CAAC,QAAQ,CAAC,eAAe;eACtB,QAAQ,CAAC,aAAa;
|
|
1
|
+
{"version":3,"file":"worker-renderer.js","sourceRoot":"","sources":["../../../../src/wafer-map/experimental/worker-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Remote, transfer } from 'comlink';\nimport type { ZoomTransform } from 'd3-zoom';\nimport type { WaferMap } from '..';\nimport { HoverDieOpacity } from '../types';\nimport { createMatrixRenderer } from '../modules/create-matrix-renderer';\nimport type { MatrixRenderer } from '../workers/matrix-renderer';\nimport type { Dimensions, RenderConfig } from '../workers/types';\n\n/**\n * Responsible for drawing the dies inside the wafer map, adding dieText and scaling the canvas\n */\nexport class WorkerRenderer {\n /**\n * @internal\n */\n public matrixRenderer!: Remote<MatrixRenderer>;\n private readonly minDieDim = 100;\n\n public constructor(private readonly wafermap: WaferMap) {}\n\n public async setupWafer(snapshot: {\n canvasDimensions: Dimensions,\n renderConfig: RenderConfig,\n columnIndices: Int32Array,\n rowIndices: Int32Array,\n values: Float64Array\n }): Promise<void> {\n if (this.matrixRenderer === undefined) {\n const { matrixRenderer } = await createMatrixRenderer();\n this.matrixRenderer = matrixRenderer;\n const offscreenCanvas = this.wafermap.workerCanvas.transferControlToOffscreen();\n await this.matrixRenderer.setCanvas(\n transfer(offscreenCanvas, [offscreenCanvas])\n );\n }\n await this.matrixRenderer.setCanvasDimensions(\n snapshot.canvasDimensions\n );\n await this.matrixRenderer.setRenderConfig(snapshot.renderConfig);\n await this.matrixRenderer.setMatrixData(\n snapshot.columnIndices,\n snapshot.rowIndices,\n snapshot.values\n );\n }\n\n public async drawWafer(snapshot: {\n canvasDimensions: Dimensions,\n dieDimensions: Dimensions,\n transform: ZoomTransform,\n dieLabelsHidden: boolean\n }): Promise<void> {\n const topLeftCanvasCorner = snapshot.transform.invert([0, 0]);\n const bottomRightCanvasCorner = snapshot.transform.invert([\n snapshot.canvasDimensions.width,\n snapshot.canvasDimensions.height\n ]);\n await this.matrixRenderer.setTransformConfig({\n transform: snapshot.transform,\n topLeftCanvasCorner: {\n x: topLeftCanvasCorner[0] - snapshot.dieDimensions.width,\n y: topLeftCanvasCorner[1] - snapshot.dieDimensions.height\n },\n bottomRightCanvasCorner: {\n x: bottomRightCanvasCorner[0],\n y: bottomRightCanvasCorner[1]\n }\n });\n await this.matrixRenderer.drawWafer();\n if (\n !snapshot.dieLabelsHidden\n && snapshot.dieDimensions.width\n * snapshot.dieDimensions.height\n * (snapshot.transform.k !== 0 ? snapshot.transform.k : 1)\n >= this.minDieDim\n ) {\n await this.matrixRenderer.drawText();\n }\n }\n\n public renderHover(): void {\n if (\n this.wafermap.computations.dieDimensions === undefined\n || this.wafermap.transform === undefined\n ) {\n return;\n }\n this.wafermap.hoverWidth = this.wafermap.computations.dieDimensions.width\n * this.wafermap.transform.k;\n this.wafermap.hoverHeight = this.wafermap.computations.dieDimensions.height\n * this.wafermap.transform.k;\n this.wafermap.hoverOpacity = this.wafermap.hoverDie === undefined\n ? HoverDieOpacity.hide\n : HoverDieOpacity.show;\n this.wafermap.hoverTransform = this.calculateHoverTransform();\n }\n\n private calculateHoverTransform(): string {\n if (this.wafermap.hoverDie !== undefined) {\n const scaledX = this.wafermap.computations.horizontalScale(\n this.wafermap.hoverDie.x\n );\n if (scaledX === undefined) {\n return '';\n }\n const scaledY = this.wafermap.computations.verticalScale(\n this.wafermap.hoverDie.y\n );\n if (scaledY === undefined) {\n return '';\n }\n const transformedPoint = this.wafermap.transform.apply([\n scaledX + this.wafermap.computations.margin.left,\n scaledY + this.wafermap.computations.margin.top\n ]);\n return `translate(${transformedPoint[0]}, ${transformedPoint[1]})`;\n }\n return '';\n }\n}\n"]}
|
|
@@ -86,7 +86,7 @@ export class RenderingModule {
|
|
|
86
86
|
}
|
|
87
87
|
const dieWidth = this.wafermap.dataManager.dieDimensions.width;
|
|
88
88
|
const dieHeight = this.wafermap.dataManager.dieDimensions.height;
|
|
89
|
-
const dieSize = dieWidth * dieHeight * (this.wafermap.transform.k
|
|
89
|
+
const dieSize = dieWidth * dieHeight * (this.wafermap.transform.k !== 0 ? this.wafermap.transform.k : 1);
|
|
90
90
|
if (dieSize >= this.minDieDim) {
|
|
91
91
|
const fontsize = this.wafermap.dataManager.labelsFontSize;
|
|
92
92
|
const context = this.wafermap.canvasContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rendering.js","sourceRoot":"","sources":["../../../../src/wafer-map/modules/rendering.ts"],"names":[],"mappings":"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","sourcesContent":["import type { WaferMap } from '..';\r\nimport { type DieRenderInfo, HoverDieOpacity } from '../types';\r\n\r\n/**\r\n * Responsible for drawing the dies inside the wafer map, adding dieText and scaling the canvas\r\n */\r\nexport class RenderingModule {\r\n private dies!: DieRenderInfo[];\r\n private readonly minDieDim = 50;\r\n\r\n public constructor(private readonly wafermap: WaferMap) {}\r\n\r\n public updateSortedDiesAndDrawWafer(): void {\r\n this.dies = this.wafermap.dataManager.diesRenderInfo.sort((a, b) => {\r\n if (a.fillStyle > b.fillStyle) {\r\n return 1;\r\n }\r\n if (b.fillStyle > a.fillStyle) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n });\r\n this.drawWafer();\r\n }\r\n\r\n public drawWafer(): void {\r\n this.wafermap.canvasContext.save();\r\n this.clearCanvas();\r\n this.scaleCanvas();\r\n this.renderDies();\r\n this.renderText();\r\n this.wafermap.canvasContext.restore();\r\n this.renderHover();\r\n }\r\n\r\n public renderHover(): void {\r\n if (\r\n this.wafermap.dataManager.dieDimensions === undefined\r\n || this.wafermap.transform === undefined\r\n ) {\r\n return;\r\n }\r\n this.wafermap.hoverWidth = this.wafermap.dataManager.dieDimensions.width\r\n * this.wafermap.transform.k;\r\n this.wafermap.hoverHeight = this.wafermap.dataManager.dieDimensions.height\r\n * this.wafermap.transform.k;\r\n this.wafermap.hoverOpacity = this.wafermap.hoverDie === undefined\r\n ? HoverDieOpacity.hide\r\n : HoverDieOpacity.show;\r\n this.wafermap.hoverTransform = this.calculateHoverTransform();\r\n }\r\n\r\n private calculateHoverTransform(): string {\r\n if (this.wafermap.hoverDie !== undefined) {\r\n const scaledX = this.wafermap.dataManager.horizontalScale(\r\n this.wafermap.hoverDie.x\r\n );\r\n if (scaledX === undefined) {\r\n return '';\r\n }\r\n const scaledY = this.wafermap.dataManager.verticalScale(\r\n this.wafermap.hoverDie.y\r\n );\r\n if (scaledY === undefined) {\r\n return '';\r\n }\r\n const transformedPoint = this.wafermap.transform.apply([\r\n scaledX + this.wafermap.dataManager.margin.left,\r\n scaledY + this.wafermap.dataManager.margin.top\r\n ]);\r\n return `translate(${transformedPoint[0]}, ${transformedPoint[1]})`;\r\n }\r\n return '';\r\n }\r\n\r\n private renderDies(): void {\r\n const context = this.wafermap.canvasContext;\r\n const dieWidth = this.wafermap.dataManager.dieDimensions.width;\r\n const dieHeight = this.wafermap.dataManager.dieDimensions.height;\r\n const transformedCanvasMinPoint = this.wafermap.transform.invert([\r\n 0, 0\r\n ]);\r\n const transformedCanvasMaxPoint = this.wafermap.transform.invert([\r\n this.wafermap.canvas.width,\r\n this.wafermap.canvas.height\r\n ]);\r\n transformedCanvasMinPoint[0] -= dieWidth;\r\n transformedCanvasMinPoint[1] -= dieHeight;\r\n\r\n for (const die of this.dies) {\r\n if (\r\n this.isDieVisible(\r\n die,\r\n transformedCanvasMinPoint,\r\n transformedCanvasMaxPoint\r\n )\r\n ) {\r\n context.fillStyle = die.fillStyle;\r\n context.fillRect(die.x, die.y, dieWidth, dieHeight);\r\n }\r\n }\r\n }\r\n\r\n private renderText(): void {\r\n if (this.wafermap.dieLabelsHidden) {\r\n return;\r\n }\r\n const dieWidth = this.wafermap.dataManager.dieDimensions.width;\r\n const dieHeight = this.wafermap.dataManager.dieDimensions.height;\r\n const dieSize = dieWidth * dieHeight * (this.wafermap.transform.k || 1);\r\n if (dieSize >= this.minDieDim) {\r\n const fontsize = this.wafermap.dataManager.labelsFontSize;\r\n const context = this.wafermap.canvasContext;\r\n context.font = `${fontsize.toString()}px sans-serif`;\r\n context.fillStyle = '#ffffff';\r\n context.textAlign = 'center';\r\n context.lineCap = 'butt';\r\n const approximateTextHeight = context.measureText('M');\r\n\r\n const transformedCanvasMinPoint = this.wafermap.transform.invert([\r\n 0, 0\r\n ]);\r\n const transformedCanvasMaxPoint = this.wafermap.transform.invert([\r\n this.wafermap.canvas.width,\r\n this.wafermap.canvas.height\r\n ]);\r\n transformedCanvasMinPoint[0] -= dieWidth;\r\n transformedCanvasMinPoint[1] -= dieHeight;\r\n\r\n for (const die of this.dies) {\r\n if (\r\n this.isDieVisible(\r\n die,\r\n transformedCanvasMinPoint,\r\n transformedCanvasMaxPoint\r\n )\r\n ) {\r\n context.fillText(\r\n die.text,\r\n die.x + dieWidth / 2,\r\n die.y + dieHeight / 2 + approximateTextHeight.width / 2,\r\n dieWidth - (dieWidth / 100) * 20\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n private clearCanvas(): void {\r\n this.wafermap.canvasContext.clearRect(\r\n 0,\r\n 0,\r\n this.wafermap.canvas.width,\r\n this.wafermap.canvas.height\r\n );\r\n }\r\n\r\n private scaleCanvas(): void {\r\n this.wafermap.canvasContext.translate(\r\n this.wafermap.transform.x,\r\n this.wafermap.transform.y\r\n );\r\n this.wafermap.canvasContext.scale(\r\n this.wafermap.transform.k,\r\n this.wafermap.transform.k\r\n );\r\n }\r\n\r\n private isDieVisible(\r\n die: DieRenderInfo,\r\n minPoint: [number, number],\r\n maxPoint: [number, number]\r\n ): boolean {\r\n return (\r\n die.x >= minPoint[0]\r\n && die.x < maxPoint[0]\r\n && die.y >= minPoint[1]\r\n && die.y < maxPoint[1]\r\n );\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"rendering.js","sourceRoot":"","sources":["../../../../src/wafer-map/modules/rendering.ts"],"names":[],"mappings":"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","sourcesContent":["import type { WaferMap } from '..';\r\nimport { type DieRenderInfo, HoverDieOpacity } from '../types';\r\n\r\n/**\r\n * Responsible for drawing the dies inside the wafer map, adding dieText and scaling the canvas\r\n */\r\nexport class RenderingModule {\r\n private dies!: DieRenderInfo[];\r\n private readonly minDieDim = 50;\r\n\r\n public constructor(private readonly wafermap: WaferMap) {}\r\n\r\n public updateSortedDiesAndDrawWafer(): void {\r\n this.dies = this.wafermap.dataManager.diesRenderInfo.sort((a, b) => {\r\n if (a.fillStyle > b.fillStyle) {\r\n return 1;\r\n }\r\n if (b.fillStyle > a.fillStyle) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n });\r\n this.drawWafer();\r\n }\r\n\r\n public drawWafer(): void {\r\n this.wafermap.canvasContext.save();\r\n this.clearCanvas();\r\n this.scaleCanvas();\r\n this.renderDies();\r\n this.renderText();\r\n this.wafermap.canvasContext.restore();\r\n this.renderHover();\r\n }\r\n\r\n public renderHover(): void {\r\n if (\r\n this.wafermap.dataManager.dieDimensions === undefined\r\n || this.wafermap.transform === undefined\r\n ) {\r\n return;\r\n }\r\n this.wafermap.hoverWidth = this.wafermap.dataManager.dieDimensions.width\r\n * this.wafermap.transform.k;\r\n this.wafermap.hoverHeight = this.wafermap.dataManager.dieDimensions.height\r\n * this.wafermap.transform.k;\r\n this.wafermap.hoverOpacity = this.wafermap.hoverDie === undefined\r\n ? HoverDieOpacity.hide\r\n : HoverDieOpacity.show;\r\n this.wafermap.hoverTransform = this.calculateHoverTransform();\r\n }\r\n\r\n private calculateHoverTransform(): string {\r\n if (this.wafermap.hoverDie !== undefined) {\r\n const scaledX = this.wafermap.dataManager.horizontalScale(\r\n this.wafermap.hoverDie.x\r\n );\r\n if (scaledX === undefined) {\r\n return '';\r\n }\r\n const scaledY = this.wafermap.dataManager.verticalScale(\r\n this.wafermap.hoverDie.y\r\n );\r\n if (scaledY === undefined) {\r\n return '';\r\n }\r\n const transformedPoint = this.wafermap.transform.apply([\r\n scaledX + this.wafermap.dataManager.margin.left,\r\n scaledY + this.wafermap.dataManager.margin.top\r\n ]);\r\n return `translate(${transformedPoint[0]}, ${transformedPoint[1]})`;\r\n }\r\n return '';\r\n }\r\n\r\n private renderDies(): void {\r\n const context = this.wafermap.canvasContext;\r\n const dieWidth = this.wafermap.dataManager.dieDimensions.width;\r\n const dieHeight = this.wafermap.dataManager.dieDimensions.height;\r\n const transformedCanvasMinPoint = this.wafermap.transform.invert([\r\n 0, 0\r\n ]);\r\n const transformedCanvasMaxPoint = this.wafermap.transform.invert([\r\n this.wafermap.canvas.width,\r\n this.wafermap.canvas.height\r\n ]);\r\n transformedCanvasMinPoint[0] -= dieWidth;\r\n transformedCanvasMinPoint[1] -= dieHeight;\r\n\r\n for (const die of this.dies) {\r\n if (\r\n this.isDieVisible(\r\n die,\r\n transformedCanvasMinPoint,\r\n transformedCanvasMaxPoint\r\n )\r\n ) {\r\n context.fillStyle = die.fillStyle;\r\n context.fillRect(die.x, die.y, dieWidth, dieHeight);\r\n }\r\n }\r\n }\r\n\r\n private renderText(): void {\r\n if (this.wafermap.dieLabelsHidden) {\r\n return;\r\n }\r\n const dieWidth = this.wafermap.dataManager.dieDimensions.width;\r\n const dieHeight = this.wafermap.dataManager.dieDimensions.height;\r\n const dieSize = dieWidth * dieHeight * (this.wafermap.transform.k !== 0 ? this.wafermap.transform.k : 1);\r\n if (dieSize >= this.minDieDim) {\r\n const fontsize = this.wafermap.dataManager.labelsFontSize;\r\n const context = this.wafermap.canvasContext;\r\n context.font = `${fontsize.toString()}px sans-serif`;\r\n context.fillStyle = '#ffffff';\r\n context.textAlign = 'center';\r\n context.lineCap = 'butt';\r\n const approximateTextHeight = context.measureText('M');\r\n\r\n const transformedCanvasMinPoint = this.wafermap.transform.invert([\r\n 0, 0\r\n ]);\r\n const transformedCanvasMaxPoint = this.wafermap.transform.invert([\r\n this.wafermap.canvas.width,\r\n this.wafermap.canvas.height\r\n ]);\r\n transformedCanvasMinPoint[0] -= dieWidth;\r\n transformedCanvasMinPoint[1] -= dieHeight;\r\n\r\n for (const die of this.dies) {\r\n if (\r\n this.isDieVisible(\r\n die,\r\n transformedCanvasMinPoint,\r\n transformedCanvasMaxPoint\r\n )\r\n ) {\r\n context.fillText(\r\n die.text,\r\n die.x + dieWidth / 2,\r\n die.y + dieHeight / 2 + approximateTextHeight.width / 2,\r\n dieWidth - (dieWidth / 100) * 20\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n private clearCanvas(): void {\r\n this.wafermap.canvasContext.clearRect(\r\n 0,\r\n 0,\r\n this.wafermap.canvas.width,\r\n this.wafermap.canvas.height\r\n );\r\n }\r\n\r\n private scaleCanvas(): void {\r\n this.wafermap.canvasContext.translate(\r\n this.wafermap.transform.x,\r\n this.wafermap.transform.y\r\n );\r\n this.wafermap.canvasContext.scale(\r\n this.wafermap.transform.k,\r\n this.wafermap.transform.k\r\n );\r\n }\r\n\r\n private isDieVisible(\r\n die: DieRenderInfo,\r\n minPoint: [number, number],\r\n maxPoint: [number, number]\r\n ): boolean {\r\n return (\r\n die.x >= minPoint[0]\r\n && die.x < maxPoint[0]\r\n && die.y >= minPoint[1]\r\n && die.y < maxPoint[1]\r\n );\r\n }\r\n}\r\n"]}
|
|
@@ -16,7 +16,7 @@ export class WaferMapValidator {
|
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
18
|
isValid() {
|
|
19
|
-
return Object.values(this.getValidity()).every(x => x
|
|
19
|
+
return Object.values(this.getValidity()).every(x => !x);
|
|
20
20
|
}
|
|
21
21
|
validateGridDimensions() {
|
|
22
22
|
this.invalidGridDimensions = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wafer-map-validator.js","sourceRoot":"","sources":["../../../../src/wafer-map/modules/wafer-map-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAInD;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IAI1B,YAAoC,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;QAH9C,0BAAqB,GAAG,KAAK,CAAC;QAC9B,2BAAsB,GAAG,KAAK,CAAC;IAEkB,CAAC;IACnD,WAAW;QACd,OAAO;YACH,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;YACjD,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;SACtD,CAAC;IACN,CAAC;IAEM,OAAO;QACV,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"wafer-map-validator.js","sourceRoot":"","sources":["../../../../src/wafer-map/modules/wafer-map-validator.ts"],"names":[],"mappings":"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","sourcesContent":["import { DataType, Precision } from 'apache-arrow';\nimport type { WaferMap } from '..';\nimport type { WaferMapValidity } from '../types';\n\n/**\n * Helper class for the nimble-wafer-map to validate that the wafer maps's grid dimensions\n * configuration is valid and report which aspects of the configuration are valid or invalid.\n */\nexport class WaferMapValidator {\n private invalidGridDimensions = false;\n private invalidDiesTableSchema = false;\n\n public constructor(private readonly wafermap: WaferMap) {}\n public getValidity(): WaferMapValidity {\n return {\n invalidGridDimensions: this.invalidGridDimensions,\n invalidDiesTableSchema: this.invalidDiesTableSchema\n };\n }\n\n public isValid(): boolean {\n return Object.values(this.getValidity()).every(x => !x);\n }\n\n public validateGridDimensions(): boolean {\n this.invalidGridDimensions = false;\n if (\n this.wafermap.gridMinX === undefined\n && this.wafermap.gridMaxX === undefined\n && this.wafermap.gridMinY === undefined\n && this.wafermap.gridMaxY === undefined\n ) {\n this.invalidGridDimensions = false;\n } else if (\n typeof this.wafermap.gridMinX !== 'number'\n || typeof this.wafermap.gridMaxX !== 'number'\n || typeof this.wafermap.gridMinY !== 'number'\n || typeof this.wafermap.gridMaxY !== 'number'\n || this.wafermap.gridMaxX < this.wafermap.gridMinX\n || this.wafermap.gridMaxY < this.wafermap.gridMinY\n ) {\n this.invalidGridDimensions = true;\n }\n return !this.invalidGridDimensions;\n }\n\n public validateDiesTableSchema(): boolean {\n this.invalidDiesTableSchema = false;\n if (this.wafermap.diesTable === undefined) {\n this.invalidDiesTableSchema = false;\n } else {\n const fields = this.wafermap.diesTable.schema.fields;\n const colField = fields.find(field => field.name === 'colIndex');\n const rowField = fields.find(field => field.name === 'rowIndex');\n const valueField = fields.find(field => field.name === 'value');\n if (\n !colField\n || !rowField\n || !valueField\n || !DataType.isInt(colField.type)\n || colField.type.bitWidth !== 32\n || !DataType.isInt(rowField.type)\n || rowField.type.bitWidth !== 32\n || !DataType.isFloat(valueField.type)\n || valueField.type.precision !== Precision.DOUBLE\n ) {\n this.invalidDiesTableSchema = true;\n }\n }\n return !this.invalidDiesTableSchema;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const workerCode = "var MatrixRenderer = (function (exports) {\n 'use strict';\n\n /**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n const proxyMarker = Symbol(\"Comlink.proxy\");\n const createEndpoint = Symbol(\"Comlink.endpoint\");\n const releaseProxy = Symbol(\"Comlink.releaseProxy\");\n const finalizer = Symbol(\"Comlink.finalizer\");\n const throwMarker = Symbol(\"Comlink.thrown\");\n const isObject = (val) => (typeof val === \"object\" && val !== null) || typeof val === \"function\";\n /**\n * Internal transfer handle to handle objects marked to proxy.\n */\n const proxyTransferHandler = {\n canHandle: (val) => isObject(val) && val[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize(port) {\n port.start();\n return wrap(port);\n },\n };\n /**\n * Internal transfer handler to handle thrown exceptions.\n */\n const throwTransferHandler = {\n canHandle: (value) => isObject(value) && throwMarker in value,\n serialize({ value }) {\n let serialized;\n if (value instanceof Error) {\n serialized = {\n isError: true,\n value: {\n message: value.message,\n name: value.name,\n stack: value.stack,\n },\n };\n }\n else {\n serialized = { isError: false, value };\n }\n return [serialized, []];\n },\n deserialize(serialized) {\n if (serialized.isError) {\n throw Object.assign(new Error(serialized.value.message), serialized.value);\n }\n throw serialized.value;\n },\n };\n /**\n * Allows customizing the serialization of certain values.\n */\n const transferHandlers = new Map([\n [\"proxy\", proxyTransferHandler],\n [\"throw\", throwTransferHandler],\n ]);\n function isAllowedOrigin(allowedOrigins, origin) {\n for (const allowedOrigin of allowedOrigins) {\n if (origin === allowedOrigin || allowedOrigin === \"*\") {\n return true;\n }\n if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\n return true;\n }\n }\n return false;\n }\n function expose(obj, ep = globalThis, allowedOrigins = [\"*\"]) {\n ep.addEventListener(\"message\", function callback(ev) {\n if (!ev || !ev.data) {\n return;\n }\n if (!isAllowedOrigin(allowedOrigins, ev.origin)) {\n console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);\n return;\n }\n const { id, type, path } = Object.assign({ path: [] }, ev.data);\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case \"GET\" /* MessageType.GET */:\n {\n returnValue = rawValue;\n }\n break;\n case \"SET\" /* MessageType.SET */:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case \"APPLY\" /* MessageType.APPLY */:\n {\n returnValue = rawValue.apply(parent, argumentList);\n }\n break;\n case \"CONSTRUCT\" /* MessageType.CONSTRUCT */:\n {\n const value = new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case \"ENDPOINT\" /* MessageType.ENDPOINT */:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n case \"RELEASE\" /* MessageType.RELEASE */:\n {\n returnValue = undefined;\n }\n break;\n default:\n return;\n }\n }\n catch (value) {\n returnValue = { value, [throwMarker]: 0 };\n }\n Promise.resolve(returnValue)\n .catch((value) => {\n return { value, [throwMarker]: 0 };\n })\n .then((returnValue) => {\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n if (type === \"RELEASE\" /* MessageType.RELEASE */) {\n // detach and deactive after sending release response above.\n ep.removeEventListener(\"message\", callback);\n closeEndPoint(ep);\n if (finalizer in obj && typeof obj[finalizer] === \"function\") {\n obj[finalizer]();\n }\n }\n })\n .catch((error) => {\n // Send Serialization Error To Caller\n const [wireValue, transferables] = toWireValue({\n value: new TypeError(\"Unserializable return value\"),\n [throwMarker]: 0,\n });\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n });\n });\n if (ep.start) {\n ep.start();\n }\n }\n function isMessagePort(endpoint) {\n return endpoint.constructor.name === \"MessagePort\";\n }\n function closeEndPoint(endpoint) {\n if (isMessagePort(endpoint))\n endpoint.close();\n }\n function wrap(ep, target) {\n const pendingListeners = new Map();\n ep.addEventListener(\"message\", function handleMessage(ev) {\n const { data } = ev;\n if (!data || !data.id) {\n return;\n }\n const resolver = pendingListeners.get(data.id);\n if (!resolver) {\n return;\n }\n try {\n resolver(data);\n }\n finally {\n pendingListeners.delete(data.id);\n }\n });\n return createProxy(ep, pendingListeners, [], target);\n }\n function throwIfProxyReleased(isReleased) {\n if (isReleased) {\n throw new Error(\"Proxy has been released and is not useable\");\n }\n }\n function releaseEndpoint(ep) {\n return requestResponseMessage(ep, new Map(), {\n type: \"RELEASE\" /* MessageType.RELEASE */,\n }).then(() => {\n closeEndPoint(ep);\n });\n }\n const proxyCounter = new WeakMap();\n const proxyFinalizers = \"FinalizationRegistry\" in globalThis &&\n new FinalizationRegistry((ep) => {\n const newCount = (proxyCounter.get(ep) || 0) - 1;\n proxyCounter.set(ep, newCount);\n if (newCount === 0) {\n releaseEndpoint(ep);\n }\n });\n function registerProxy(proxy, ep) {\n const newCount = (proxyCounter.get(ep) || 0) + 1;\n proxyCounter.set(ep, newCount);\n if (proxyFinalizers) {\n proxyFinalizers.register(proxy, ep, proxy);\n }\n }\n function unregisterProxy(proxy) {\n if (proxyFinalizers) {\n proxyFinalizers.unregister(proxy);\n }\n }\n function createProxy(ep, pendingListeners, path = [], target = function () { }) {\n let isProxyReleased = false;\n const proxy = new Proxy(target, {\n get(_target, prop) {\n throwIfProxyReleased(isProxyReleased);\n if (prop === releaseProxy) {\n return () => {\n unregisterProxy(proxy);\n releaseEndpoint(ep);\n pendingListeners.clear();\n isProxyReleased = true;\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, pendingListeners, {\n type: \"GET\" /* MessageType.GET */,\n path: path.map((p) => p.toString()),\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, pendingListeners, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n throwIfProxyReleased(isProxyReleased);\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously \u00AF\\_(\u30C4)_/\u00AF\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(ep, pendingListeners, {\n type: \"SET\" /* MessageType.SET */,\n path: [...path, prop].map((p) => p.toString()),\n value,\n }, transferables).then(fromWireValue);\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const last = path[path.length - 1];\n if (last === createEndpoint) {\n return requestResponseMessage(ep, pendingListeners, {\n type: \"ENDPOINT\" /* MessageType.ENDPOINT */,\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn\u2019t happen.\n if (last === \"bind\") {\n return createProxy(ep, pendingListeners, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, pendingListeners, {\n type: \"APPLY\" /* MessageType.APPLY */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, pendingListeners, {\n type: \"CONSTRUCT\" /* MessageType.CONSTRUCT */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n });\n registerProxy(proxy, ep);\n return proxy;\n }\n function myFlat(arr) {\n return Array.prototype.concat.apply([], arr);\n }\n function processArguments(argumentList) {\n const processed = argumentList.map(toWireValue);\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\n }\n const transferCache = new WeakMap();\n function transfer(obj, transfers) {\n transferCache.set(obj, transfers);\n return obj;\n }\n function proxy(obj) {\n return Object.assign(obj, { [proxyMarker]: true });\n }\n function toWireValue(value) {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: \"HANDLER\" /* WireValueType.HANDLER */,\n name,\n value: serializedValue,\n },\n transferables,\n ];\n }\n }\n return [\n {\n type: \"RAW\" /* WireValueType.RAW */,\n value,\n },\n transferCache.get(value) || [],\n ];\n }\n function fromWireValue(value) {\n switch (value.type) {\n case \"HANDLER\" /* WireValueType.HANDLER */:\n return transferHandlers.get(value.name).deserialize(value.value);\n case \"RAW\" /* WireValueType.RAW */:\n return value.value;\n }\n }\n function requestResponseMessage(ep, pendingListeners, msg, transfers) {\n return new Promise((resolve) => {\n const id = generateUUID();\n pendingListeners.set(id, resolve);\n if (ep.start) {\n ep.start();\n }\n ep.postMessage(Object.assign({ id }, msg), transfers);\n });\n }\n function generateUUID() {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n }\n\n /**\n * MatrixRenderer class is meant to be used within a Web Worker context,\n * using Comlink to facilitate communication between the main thread and the worker.\n * The MatrixRenderer class manages a matrix of dies, once an instance of MatrixRenderer is created,\n * it is exposed to the main thread using Comlink's `expose` method.\n * This setup is used in the wafer-map component to perform heavy computational duties\n */\n class MatrixRenderer {\n constructor() {\n this.values = Float64Array.from([]);\n this.scaledColumnIndices = Float64Array.from([]);\n this.scaledRowIndices = Float64Array.from([]);\n this.columnIndicesPositions = Int32Array.from([]);\n this.colorIndices = Int32Array.from([]);\n this.colors = [];\n this.colorValues = Float64Array.from([]);\n this.outsideRangeDieColor = 'rgba(218,223,236,1)';\n this.fontSizeFactor = 0.8;\n this.renderConfig = {\n dieDimensions: {\n width: 0,\n height: 0\n },\n margin: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n },\n verticalCoefficient: 1,\n horizontalCoefficient: 1,\n horizontalConstant: 0,\n verticalConstant: 0,\n gridMinX: 0,\n gridMaxX: 0,\n gridMinY: 0,\n gridMaxY: 0,\n labelsFontSize: 0,\n colorScale: [],\n dieLabelsSuffix: '',\n maxCharacters: 0\n };\n this.transformConfig = {\n transform: {\n k: 1,\n x: 0,\n y: 0\n },\n topLeftCanvasCorner: {\n x: 0,\n y: 0\n },\n bottomRightCanvasCorner: {\n x: 0,\n y: 0\n }\n };\n }\n setMatrixData(columnIndices, rowIndices, valuesBuffer) {\n const scaledColumnIndex = [];\n const columnPositions = [];\n const scaledRowIndices = [];\n const values = [];\n const colorIndices = [];\n let prevXIndex;\n let dieCount = 0;\n for (let i = 0; i < columnIndices.length; i++) {\n const xIndex = columnIndices[i];\n const yIndex = rowIndices[i];\n if (this.isDieInGrid(xIndex, yIndex)) {\n if (xIndex !== prevXIndex) {\n scaledColumnIndex.push(this.calculateHorizontalScaledIndices(xIndex));\n columnPositions.push(dieCount);\n prevXIndex = xIndex;\n }\n scaledRowIndices.push(this.calculateVerticalScaledIndices(yIndex));\n const value = valuesBuffer[i];\n values.push(value);\n colorIndices.push(this.findColorIndex(value));\n dieCount += 1;\n }\n }\n this.scaledColumnIndices = Float64Array.from(scaledColumnIndex);\n this.columnIndicesPositions = Int32Array.from(columnPositions);\n this.scaledRowIndices = Float64Array.from(scaledRowIndices);\n this.values = Float64Array.from(values);\n this.colorIndices = Int32Array.from(colorIndices);\n }\n setRenderConfig(renderConfig) {\n this.renderConfig = renderConfig;\n this.colors = renderConfig.colorScale.map(marker => marker.color);\n this.colorValues = Float64Array.from(renderConfig.colorScale.map(marker => marker.value));\n }\n setTransformConfig(transformData) {\n this.transformConfig = transformData;\n }\n setCanvas(canvas) {\n this.canvas = canvas;\n this.context = canvas.getContext('2d');\n }\n scaleCanvas() {\n this.context.translate(this.transformConfig.transform.x, this.transformConfig.transform.y);\n this.context.scale(this.transformConfig.transform.k, this.transformConfig.transform.k);\n }\n setCanvasDimensions(data) {\n this.canvas.width = data.width;\n this.canvas.height = data.height;\n }\n getCanvasDimensions() {\n return {\n width: this.canvas.width,\n height: this.canvas.height\n };\n }\n clearCanvas() {\n this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n drawWafer() {\n this.context.restore();\n this.context.save();\n this.clearCanvas();\n this.scaleCanvas();\n for (let i = 0; i < this.scaledColumnIndices.length; i++) {\n const scaledX = this.scaledColumnIndices[i];\n if (!(scaledX >= this.transformConfig.topLeftCanvasCorner.x\n && scaledX < this.transformConfig.bottomRightCanvasCorner.x)) {\n continue;\n }\n // columnIndexPositions is used to get chunks to determine the start and end index of the column, it looks something like [0, 1, 4, 9, 12]\n // This means that the first column has a start index of 0 and an end index of 1, the second column has a start index of 1 and an end index of 4, and so on\n // scaledRowIndices is used when we reach the end of the columnIndexPositions, when columnIndexPositions is [0, 1, 4, 9, 12], scaledRowIndices is 13\n const columnEndIndex = this.columnIndicesPositions[i + 1] !== undefined\n ? this.columnIndicesPositions[i + 1]\n : this.scaledRowIndices.length;\n for (let columnStartIndex = this.columnIndicesPositions[i]; columnStartIndex < columnEndIndex; columnStartIndex++) {\n const scaledY = this.scaledRowIndices[columnStartIndex];\n if (!(scaledY >= this.transformConfig.topLeftCanvasCorner.y\n && scaledY < this.transformConfig.bottomRightCanvasCorner.y)) {\n continue;\n }\n // Fill style is temporary green for all dies, will be replaced with a color based on the value of the die in a future implementation\n this.context.fillStyle = this.colors[this.colorIndices[columnStartIndex]]\n ?? this.outsideRangeDieColor;\n this.context.fillRect(scaledX, scaledY, this.renderConfig.dieDimensions.width, this.renderConfig.dieDimensions.height);\n }\n }\n }\n drawText() {\n this.context.font = `${this.renderConfig.labelsFontSize.toString()}px sans-serif`;\n this.context.fillStyle = '#ffffff';\n this.context.textAlign = 'center';\n this.context.lineCap = 'butt';\n const approximateTextHeight = this.context.measureText('M');\n for (let i = 0; i < this.scaledColumnIndices.length; i++) {\n const scaledX = this.scaledColumnIndices[i];\n if (!(scaledX >= this.transformConfig.topLeftCanvasCorner.x\n && scaledX < this.transformConfig.bottomRightCanvasCorner.x)) {\n continue;\n }\n // columnIndexPositions is used to get chunks to determine the start and end index of the column, it looks something like [0, 1, 4, 9, 12]\n // This means that the first column has a start index of 0 and an end index of 1, the second column has a start index of 1 and an end index of 4, and so on\n // scaledRowIndices is used when we reach the end of the columnIndexPositions, when columnIndexPositions is [0, 1, 4, 9, 12], scaledRowIndices is 13\n const columnEndIndex = this.columnIndicesPositions[i + 1] !== undefined\n ? this.columnIndicesPositions[i + 1]\n : this.scaledRowIndices.length;\n for (let columnStartIndex = this.columnIndicesPositions[i]; columnStartIndex < columnEndIndex; columnStartIndex++) {\n const scaledY = this.scaledRowIndices[columnStartIndex];\n if (!(scaledY >= this.transformConfig.topLeftCanvasCorner.y\n && scaledY < this.transformConfig.bottomRightCanvasCorner.y)) {\n continue;\n }\n let label = `${this.values[columnStartIndex] || 'NaN'}${this.renderConfig.dieLabelsSuffix}`;\n if (label.length >= this.renderConfig.maxCharacters) {\n label = `${label.substring(0, this.renderConfig.maxCharacters)}\u2026`;\n }\n this.context.fillText(label, scaledX + this.renderConfig.dieDimensions.width / 2, scaledY\n + this.renderConfig.dieDimensions.height / 2\n + approximateTextHeight.width / 2, this.renderConfig.dieDimensions.width * this.fontSizeFactor);\n }\n }\n }\n isDieInGrid(x, y) {\n return (x >= this.renderConfig.gridMinX\n && x <= this.renderConfig.gridMaxX\n && y >= this.renderConfig.gridMinY\n && y <= this.renderConfig.gridMaxY);\n }\n calculateHorizontalScaledIndices(columnIndex) {\n return (this.renderConfig.horizontalCoefficient * columnIndex\n + this.renderConfig.horizontalConstant\n + this.renderConfig.margin.left);\n }\n calculateVerticalScaledIndices(rowIndex) {\n return (this.renderConfig.verticalCoefficient * rowIndex\n + this.renderConfig.verticalConstant\n + this.renderConfig.margin.top);\n }\n findColorIndex(value) {\n let index = -1;\n if (this.colorValues.length === 0 || this.colorValues[0] >= value) {\n return index;\n }\n for (let i = 0; i < this.colorValues.length; i++) {\n if (value <= this.colorValues[i]) {\n index = i;\n break;\n }\n }\n return index;\n }\n }\n expose(MatrixRenderer);\n\n exports.MatrixRenderer = MatrixRenderer;\n\n return exports;\n\n})({});\n";
|
|
1
|
+
export declare const workerCode = "var MatrixRenderer = (function (exports) {\n 'use strict';\n\n /**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n const proxyMarker = Symbol(\"Comlink.proxy\");\n const createEndpoint = Symbol(\"Comlink.endpoint\");\n const releaseProxy = Symbol(\"Comlink.releaseProxy\");\n const finalizer = Symbol(\"Comlink.finalizer\");\n const throwMarker = Symbol(\"Comlink.thrown\");\n const isObject = (val) => (typeof val === \"object\" && val !== null) || typeof val === \"function\";\n /**\n * Internal transfer handle to handle objects marked to proxy.\n */\n const proxyTransferHandler = {\n canHandle: (val) => isObject(val) && val[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize(port) {\n port.start();\n return wrap(port);\n },\n };\n /**\n * Internal transfer handler to handle thrown exceptions.\n */\n const throwTransferHandler = {\n canHandle: (value) => isObject(value) && throwMarker in value,\n serialize({ value }) {\n let serialized;\n if (value instanceof Error) {\n serialized = {\n isError: true,\n value: {\n message: value.message,\n name: value.name,\n stack: value.stack,\n },\n };\n }\n else {\n serialized = { isError: false, value };\n }\n return [serialized, []];\n },\n deserialize(serialized) {\n if (serialized.isError) {\n throw Object.assign(new Error(serialized.value.message), serialized.value);\n }\n throw serialized.value;\n },\n };\n /**\n * Allows customizing the serialization of certain values.\n */\n const transferHandlers = new Map([\n [\"proxy\", proxyTransferHandler],\n [\"throw\", throwTransferHandler],\n ]);\n function isAllowedOrigin(allowedOrigins, origin) {\n for (const allowedOrigin of allowedOrigins) {\n if (origin === allowedOrigin || allowedOrigin === \"*\") {\n return true;\n }\n if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\n return true;\n }\n }\n return false;\n }\n function expose(obj, ep = globalThis, allowedOrigins = [\"*\"]) {\n ep.addEventListener(\"message\", function callback(ev) {\n if (!ev || !ev.data) {\n return;\n }\n if (!isAllowedOrigin(allowedOrigins, ev.origin)) {\n console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);\n return;\n }\n const { id, type, path } = Object.assign({ path: [] }, ev.data);\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case \"GET\" /* MessageType.GET */:\n {\n returnValue = rawValue;\n }\n break;\n case \"SET\" /* MessageType.SET */:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case \"APPLY\" /* MessageType.APPLY */:\n {\n returnValue = rawValue.apply(parent, argumentList);\n }\n break;\n case \"CONSTRUCT\" /* MessageType.CONSTRUCT */:\n {\n const value = new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case \"ENDPOINT\" /* MessageType.ENDPOINT */:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n case \"RELEASE\" /* MessageType.RELEASE */:\n {\n returnValue = undefined;\n }\n break;\n default:\n return;\n }\n }\n catch (value) {\n returnValue = { value, [throwMarker]: 0 };\n }\n Promise.resolve(returnValue)\n .catch((value) => {\n return { value, [throwMarker]: 0 };\n })\n .then((returnValue) => {\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n if (type === \"RELEASE\" /* MessageType.RELEASE */) {\n // detach and deactive after sending release response above.\n ep.removeEventListener(\"message\", callback);\n closeEndPoint(ep);\n if (finalizer in obj && typeof obj[finalizer] === \"function\") {\n obj[finalizer]();\n }\n }\n })\n .catch((error) => {\n // Send Serialization Error To Caller\n const [wireValue, transferables] = toWireValue({\n value: new TypeError(\"Unserializable return value\"),\n [throwMarker]: 0,\n });\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n });\n });\n if (ep.start) {\n ep.start();\n }\n }\n function isMessagePort(endpoint) {\n return endpoint.constructor.name === \"MessagePort\";\n }\n function closeEndPoint(endpoint) {\n if (isMessagePort(endpoint))\n endpoint.close();\n }\n function wrap(ep, target) {\n const pendingListeners = new Map();\n ep.addEventListener(\"message\", function handleMessage(ev) {\n const { data } = ev;\n if (!data || !data.id) {\n return;\n }\n const resolver = pendingListeners.get(data.id);\n if (!resolver) {\n return;\n }\n try {\n resolver(data);\n }\n finally {\n pendingListeners.delete(data.id);\n }\n });\n return createProxy(ep, pendingListeners, [], target);\n }\n function throwIfProxyReleased(isReleased) {\n if (isReleased) {\n throw new Error(\"Proxy has been released and is not useable\");\n }\n }\n function releaseEndpoint(ep) {\n return requestResponseMessage(ep, new Map(), {\n type: \"RELEASE\" /* MessageType.RELEASE */,\n }).then(() => {\n closeEndPoint(ep);\n });\n }\n const proxyCounter = new WeakMap();\n const proxyFinalizers = \"FinalizationRegistry\" in globalThis &&\n new FinalizationRegistry((ep) => {\n const newCount = (proxyCounter.get(ep) || 0) - 1;\n proxyCounter.set(ep, newCount);\n if (newCount === 0) {\n releaseEndpoint(ep);\n }\n });\n function registerProxy(proxy, ep) {\n const newCount = (proxyCounter.get(ep) || 0) + 1;\n proxyCounter.set(ep, newCount);\n if (proxyFinalizers) {\n proxyFinalizers.register(proxy, ep, proxy);\n }\n }\n function unregisterProxy(proxy) {\n if (proxyFinalizers) {\n proxyFinalizers.unregister(proxy);\n }\n }\n function createProxy(ep, pendingListeners, path = [], target = function () { }) {\n let isProxyReleased = false;\n const proxy = new Proxy(target, {\n get(_target, prop) {\n throwIfProxyReleased(isProxyReleased);\n if (prop === releaseProxy) {\n return () => {\n unregisterProxy(proxy);\n releaseEndpoint(ep);\n pendingListeners.clear();\n isProxyReleased = true;\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, pendingListeners, {\n type: \"GET\" /* MessageType.GET */,\n path: path.map((p) => p.toString()),\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, pendingListeners, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n throwIfProxyReleased(isProxyReleased);\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously \u00AF\\_(\u30C4)_/\u00AF\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(ep, pendingListeners, {\n type: \"SET\" /* MessageType.SET */,\n path: [...path, prop].map((p) => p.toString()),\n value,\n }, transferables).then(fromWireValue);\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const last = path[path.length - 1];\n if (last === createEndpoint) {\n return requestResponseMessage(ep, pendingListeners, {\n type: \"ENDPOINT\" /* MessageType.ENDPOINT */,\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn\u2019t happen.\n if (last === \"bind\") {\n return createProxy(ep, pendingListeners, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, pendingListeners, {\n type: \"APPLY\" /* MessageType.APPLY */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, pendingListeners, {\n type: \"CONSTRUCT\" /* MessageType.CONSTRUCT */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n });\n registerProxy(proxy, ep);\n return proxy;\n }\n function myFlat(arr) {\n return Array.prototype.concat.apply([], arr);\n }\n function processArguments(argumentList) {\n const processed = argumentList.map(toWireValue);\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\n }\n const transferCache = new WeakMap();\n function transfer(obj, transfers) {\n transferCache.set(obj, transfers);\n return obj;\n }\n function proxy(obj) {\n return Object.assign(obj, { [proxyMarker]: true });\n }\n function toWireValue(value) {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: \"HANDLER\" /* WireValueType.HANDLER */,\n name,\n value: serializedValue,\n },\n transferables,\n ];\n }\n }\n return [\n {\n type: \"RAW\" /* WireValueType.RAW */,\n value,\n },\n transferCache.get(value) || [],\n ];\n }\n function fromWireValue(value) {\n switch (value.type) {\n case \"HANDLER\" /* WireValueType.HANDLER */:\n return transferHandlers.get(value.name).deserialize(value.value);\n case \"RAW\" /* WireValueType.RAW */:\n return value.value;\n }\n }\n function requestResponseMessage(ep, pendingListeners, msg, transfers) {\n return new Promise((resolve) => {\n const id = generateUUID();\n pendingListeners.set(id, resolve);\n if (ep.start) {\n ep.start();\n }\n ep.postMessage(Object.assign({ id }, msg), transfers);\n });\n }\n function generateUUID() {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n }\n\n /**\n * MatrixRenderer class is meant to be used within a Web Worker context,\n * using Comlink to facilitate communication between the main thread and the worker.\n * The MatrixRenderer class manages a matrix of dies, once an instance of MatrixRenderer is created,\n * it is exposed to the main thread using Comlink's `expose` method.\n * This setup is used in the wafer-map component to perform heavy computational duties\n */\n class MatrixRenderer {\n constructor() {\n this.values = Float64Array.from([]);\n this.scaledColumnIndices = Float64Array.from([]);\n this.scaledRowIndices = Float64Array.from([]);\n this.columnIndicesPositions = Int32Array.from([]);\n this.colorIndices = Int32Array.from([]);\n this.colors = [];\n this.colorValues = Float64Array.from([]);\n this.outsideRangeDieColor = 'rgba(218,223,236,1)';\n this.fontSizeFactor = 0.8;\n this.renderConfig = {\n dieDimensions: {\n width: 0,\n height: 0\n },\n margin: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n },\n verticalCoefficient: 1,\n horizontalCoefficient: 1,\n horizontalConstant: 0,\n verticalConstant: 0,\n gridMinX: 0,\n gridMaxX: 0,\n gridMinY: 0,\n gridMaxY: 0,\n labelsFontSize: 0,\n colorScale: [],\n dieLabelsSuffix: '',\n maxCharacters: 0\n };\n this.transformConfig = {\n transform: {\n k: 1,\n x: 0,\n y: 0\n },\n topLeftCanvasCorner: {\n x: 0,\n y: 0\n },\n bottomRightCanvasCorner: {\n x: 0,\n y: 0\n }\n };\n }\n setMatrixData(columnIndices, rowIndices, valuesBuffer) {\n const scaledColumnIndex = [];\n const columnPositions = [];\n const scaledRowIndices = [];\n const values = [];\n const colorIndices = [];\n let prevXIndex;\n let dieCount = 0;\n for (let i = 0; i < columnIndices.length; i++) {\n const xIndex = columnIndices[i];\n const yIndex = rowIndices[i];\n if (this.isDieInGrid(xIndex, yIndex)) {\n if (xIndex !== prevXIndex) {\n scaledColumnIndex.push(this.calculateHorizontalScaledIndices(xIndex));\n columnPositions.push(dieCount);\n prevXIndex = xIndex;\n }\n scaledRowIndices.push(this.calculateVerticalScaledIndices(yIndex));\n const value = valuesBuffer[i];\n values.push(value);\n colorIndices.push(this.findColorIndex(value));\n dieCount += 1;\n }\n }\n this.scaledColumnIndices = Float64Array.from(scaledColumnIndex);\n this.columnIndicesPositions = Int32Array.from(columnPositions);\n this.scaledRowIndices = Float64Array.from(scaledRowIndices);\n this.values = Float64Array.from(values);\n this.colorIndices = Int32Array.from(colorIndices);\n }\n setRenderConfig(renderConfig) {\n this.renderConfig = renderConfig;\n this.colors = renderConfig.colorScale.map(marker => marker.color);\n this.colorValues = Float64Array.from(renderConfig.colorScale.map(marker => marker.value));\n }\n setTransformConfig(transformData) {\n this.transformConfig = transformData;\n }\n setCanvas(canvas) {\n this.canvas = canvas;\n this.context = canvas.getContext('2d');\n }\n scaleCanvas() {\n this.context.translate(this.transformConfig.transform.x, this.transformConfig.transform.y);\n this.context.scale(this.transformConfig.transform.k, this.transformConfig.transform.k);\n }\n setCanvasDimensions(data) {\n this.canvas.width = data.width;\n this.canvas.height = data.height;\n }\n getCanvasDimensions() {\n return {\n width: this.canvas.width,\n height: this.canvas.height\n };\n }\n clearCanvas() {\n this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n drawWafer() {\n this.context.restore();\n this.context.save();\n this.clearCanvas();\n this.scaleCanvas();\n for (let i = 0; i < this.scaledColumnIndices.length; i++) {\n const scaledX = this.scaledColumnIndices[i];\n if (!(scaledX >= this.transformConfig.topLeftCanvasCorner.x\n && scaledX < this.transformConfig.bottomRightCanvasCorner.x)) {\n continue;\n }\n // columnIndexPositions is used to get chunks to determine the start and end index of the column, it looks something like [0, 1, 4, 9, 12]\n // This means that the first column has a start index of 0 and an end index of 1, the second column has a start index of 1 and an end index of 4, and so on\n // scaledRowIndices is used when we reach the end of the columnIndexPositions, when columnIndexPositions is [0, 1, 4, 9, 12], scaledRowIndices is 13\n const columnEndIndex = this.columnIndicesPositions[i + 1] !== undefined\n ? this.columnIndicesPositions[i + 1]\n : this.scaledRowIndices.length;\n for (let columnStartIndex = this.columnIndicesPositions[i]; columnStartIndex < columnEndIndex; columnStartIndex++) {\n const scaledY = this.scaledRowIndices[columnStartIndex];\n if (!(scaledY >= this.transformConfig.topLeftCanvasCorner.y\n && scaledY < this.transformConfig.bottomRightCanvasCorner.y)) {\n continue;\n }\n // Fill style is temporary green for all dies, will be replaced with a color based on the value of the die in a future implementation\n this.context.fillStyle = this.colors[this.colorIndices[columnStartIndex]]\n ?? this.outsideRangeDieColor;\n this.context.fillRect(scaledX, scaledY, this.renderConfig.dieDimensions.width, this.renderConfig.dieDimensions.height);\n }\n }\n }\n drawText() {\n this.context.font = `${this.renderConfig.labelsFontSize.toString()}px sans-serif`;\n this.context.fillStyle = '#ffffff';\n this.context.textAlign = 'center';\n this.context.lineCap = 'butt';\n const approximateTextHeight = this.context.measureText('M');\n for (let i = 0; i < this.scaledColumnIndices.length; i++) {\n const scaledX = this.scaledColumnIndices[i];\n if (!(scaledX >= this.transformConfig.topLeftCanvasCorner.x\n && scaledX < this.transformConfig.bottomRightCanvasCorner.x)) {\n continue;\n }\n // columnIndexPositions is used to get chunks to determine the start and end index of the column, it looks something like [0, 1, 4, 9, 12]\n // This means that the first column has a start index of 0 and an end index of 1, the second column has a start index of 1 and an end index of 4, and so on\n // scaledRowIndices is used when we reach the end of the columnIndexPositions, when columnIndexPositions is [0, 1, 4, 9, 12], scaledRowIndices is 13\n const columnEndIndex = this.columnIndicesPositions[i + 1] !== undefined\n ? this.columnIndicesPositions[i + 1]\n : this.scaledRowIndices.length;\n for (let columnStartIndex = this.columnIndicesPositions[i]; columnStartIndex < columnEndIndex; columnStartIndex++) {\n const scaledY = this.scaledRowIndices[columnStartIndex];\n if (!(scaledY >= this.transformConfig.topLeftCanvasCorner.y\n && scaledY < this.transformConfig.bottomRightCanvasCorner.y)) {\n continue;\n }\n let label = `${this.values[columnStartIndex] ?? 'NaN'}${this.renderConfig.dieLabelsSuffix}`;\n if (label.length >= this.renderConfig.maxCharacters) {\n label = `${label.substring(0, this.renderConfig.maxCharacters)}\u2026`;\n }\n this.context.fillText(label, scaledX + this.renderConfig.dieDimensions.width / 2, scaledY\n + this.renderConfig.dieDimensions.height / 2\n + approximateTextHeight.width / 2, this.renderConfig.dieDimensions.width * this.fontSizeFactor);\n }\n }\n }\n isDieInGrid(x, y) {\n return (x >= this.renderConfig.gridMinX\n && x <= this.renderConfig.gridMaxX\n && y >= this.renderConfig.gridMinY\n && y <= this.renderConfig.gridMaxY);\n }\n calculateHorizontalScaledIndices(columnIndex) {\n return (this.renderConfig.horizontalCoefficient * columnIndex\n + this.renderConfig.horizontalConstant\n + this.renderConfig.margin.left);\n }\n calculateVerticalScaledIndices(rowIndex) {\n return (this.renderConfig.verticalCoefficient * rowIndex\n + this.renderConfig.verticalConstant\n + this.renderConfig.margin.top);\n }\n findColorIndex(value) {\n let index = -1;\n if (this.colorValues.length === 0 || this.colorValues[0] >= value) {\n return index;\n }\n for (let i = 0; i < this.colorValues.length; i++) {\n if (value <= this.colorValues[i]) {\n index = i;\n break;\n }\n }\n return index;\n }\n }\n expose(MatrixRenderer);\n\n exports.MatrixRenderer = MatrixRenderer;\n\n return exports;\n\n})({});\n";
|